为什么我的承诺散列在传递的承诺解决之前解决?
Why does my hash of promises resolve before passed promises resolve?
我使用 promises 有一段时间了,但有时我会遇到似乎无法解决的问题(无双关语意)。
我有一个文件数组,我必须为每个文件执行异步函数调用以获取一些元数据。
我正在使用 RSVP.hash()
并传递由加载一些元数据并将其作为属性添加到文件的函数返回的承诺数组。我的问题是 hash()
函数返回的承诺在任何传递的承诺得到解决之前得到解决,因此,它很快进入 then()
函数。
我创建了一个 JSfiddle 来说明我的问题。我已经探索了这不是由于 RSVP 而不是 JavaScript 解释器如何读取代码的可能性,并且可能会立即评估我认为最后 运行 的部分。
我是否使用了 RSVP.hash()
错误的方式、遗漏了某些东西,或者我的代码中有任何其他错误会导致它以这种方式运行而不是我的意图?
下面的代码片段与 JSFiddle 相同。
function checkFileStatus(item) {
return new RSVP.Promise(function(resolve, reject) {
setTimeout(function() {
$('#list').append("<li>Checking status for " + item.title);
resolve();
}, 1000);
});
}
function init() {
var fileList = [{
title: "First object"
}, {
title: "Second object"
}, {
title: "Third object"
}];
var statusCheck = fileList.map(function(item) {
return checkFileStatus(item);
});
var promises = {
promisesCheckFileStatus: statusCheck
};
RSVP.hash(promises).then(function() {
$('#list').append("<li>This should happen last!");
});
}
init();
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<script src="//cdn.jsdelivr.net/rsvp/3.0.6/rsvp.js"></script>
<div>
<ul id="list"></ul>
</div>
您尝试使用 hash()
解析的对象有一个 数组 充满了承诺。 hash
仅解决 keys/values 本身就是 promise 的问题。
所以你在哪里有这个
var promises = {
key: [promise1, promise2, promise3]
};
你应该
var promises = { key: PromiseThatWillResolveToOtherPromises };
改变
var promises = {
promisesCheckFileStatus: statusCheck
};
到
var promises = {
promisesCheckFileStatus: RSVP.all(statusCheck)
};
哈希部分不正确。键 promisesCheckFileStatus
包含一个数组而不是一个 Promise。你需要做这样的事情:
var promises = {
promisesCheckFileStatus: checkFileStatus(fileList[0]),
promisesCheckFileStatus1: checkFileStatus(fileList[1]),
promisesCheckFileStatus2: checkFileStatus(fileList[2]),
};
我使用 promises 有一段时间了,但有时我会遇到似乎无法解决的问题(无双关语意)。
我有一个文件数组,我必须为每个文件执行异步函数调用以获取一些元数据。
我正在使用 RSVP.hash()
并传递由加载一些元数据并将其作为属性添加到文件的函数返回的承诺数组。我的问题是 hash()
函数返回的承诺在任何传递的承诺得到解决之前得到解决,因此,它很快进入 then()
函数。
我创建了一个 JSfiddle 来说明我的问题。我已经探索了这不是由于 RSVP 而不是 JavaScript 解释器如何读取代码的可能性,并且可能会立即评估我认为最后 运行 的部分。
我是否使用了 RSVP.hash()
错误的方式、遗漏了某些东西,或者我的代码中有任何其他错误会导致它以这种方式运行而不是我的意图?
下面的代码片段与 JSFiddle 相同。
function checkFileStatus(item) {
return new RSVP.Promise(function(resolve, reject) {
setTimeout(function() {
$('#list').append("<li>Checking status for " + item.title);
resolve();
}, 1000);
});
}
function init() {
var fileList = [{
title: "First object"
}, {
title: "Second object"
}, {
title: "Third object"
}];
var statusCheck = fileList.map(function(item) {
return checkFileStatus(item);
});
var promises = {
promisesCheckFileStatus: statusCheck
};
RSVP.hash(promises).then(function() {
$('#list').append("<li>This should happen last!");
});
}
init();
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<script src="//cdn.jsdelivr.net/rsvp/3.0.6/rsvp.js"></script>
<div>
<ul id="list"></ul>
</div>
您尝试使用 hash()
解析的对象有一个 数组 充满了承诺。 hash
仅解决 keys/values 本身就是 promise 的问题。
所以你在哪里有这个
var promises = {
key: [promise1, promise2, promise3]
};
你应该
var promises = { key: PromiseThatWillResolveToOtherPromises };
改变
var promises = {
promisesCheckFileStatus: statusCheck
};
到
var promises = {
promisesCheckFileStatus: RSVP.all(statusCheck)
};
哈希部分不正确。键 promisesCheckFileStatus
包含一个数组而不是一个 Promise。你需要做这样的事情:
var promises = {
promisesCheckFileStatus: checkFileStatus(fileList[0]),
promisesCheckFileStatus1: checkFileStatus(fileList[1]),
promisesCheckFileStatus2: checkFileStatus(fileList[2]),
};