我一直在使用承诺,但偶尔偶尔发现我似乎无法解决的问题(没有双关语意思)。为什么在通过承诺解决之前,我的承诺散列解决?
我有一个文件数组,我必须为每个文件执行异步函数调用以获取一些元数据。
我使用RSVP.hash()
并传递了一个函数返回的承诺数组,它加载了一些元数据并将其作为属性添加到文件中。我的问题是hash()
函数返回的许诺会在任何传递的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();
<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>
哇,多么简单的事情可以忽略。下一次,我会确保我记住我实际通过的参数!谢谢! –