我已经使用了一段时间的承诺,但偶尔我偶然发现我似乎无法解决的问题(没有双关语意)。
我有一个文件数组,我必须为每个文件执行异步函数调用以获取一些元数据。
我使用RSVP.hash()
并传递一个函数返回的promises数组,该函数加载一些元数据并将其作为属性添加到文件中。我的问题是hash()
函数返回的promise在解决任何传递的promise之前就已解决,因此它很快就会进入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();
&#13;
<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>
&#13;
答案 0 :(得分:1)
您尝试使用hash()
解决的对象的数组充满了承诺。 hash
仅解析承诺本身的键/值。
所以你有这个
var promises = {
key: [promise1, promise2, promise3]
};
你应该
var promises = { key: PromiseThatWillResolveToOtherPromises };
更改
var promises = {
promisesCheckFileStatus: statusCheck
};
到
var promises = {
promisesCheckFileStatus: RSVP.all(statusCheck)
};
答案 1 :(得分:1)
哈希部分不正确。键promisesCheckFileStatus
包含一个数组,而不是一个Promise。你需要做这样的事情:
var promises = {
promisesCheckFileStatus: checkFileStatus(fileList[0]),
promisesCheckFileStatus1: checkFileStatus(fileList[1]),
promisesCheckFileStatus2: checkFileStatus(fileList[2]),
};