为什么我的承诺散列在传递的承诺解决之前就解决了?
Why does my hash of promises resolve before passed promises resolve?
我已经使用承诺有一段时间了,但现在我偶尔会遇到我似乎无法解决的问题(没有双关语)。
我有一个文件数组,我必须为每个文件执行异步函数调用以获取一些元数据。
我使用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
只解析承诺本身的键/值。
所以这里有这个
var promises = {
key: [promise1, promise2, promise3]
};
你应该有
var promises = { key: PromiseThatWillResolveToOtherPromises };
改变var promises = {
promisesCheckFileStatus: statusCheck
};
var promises = {
promisesCheckFileStatus: RSVP.all(statusCheck)
};
哈希部分不正确。键promisesCheckFileStatus
包含Array而不是Promise。你需要做这样的事情:
var promises = {
promisesCheckFileStatus: checkFileStatus(fileList[0]),
promisesCheckFileStatus1: checkFileStatus(fileList[1]),
promisesCheckFileStatus2: checkFileStatus(fileList[2]),
};
相关文章:
- 简单的ES6承诺问题-交换解决和拒绝参数
- RxJS等待承诺解决
- 如何在解决承诺之前和之后验证值
- AngularJS-我怎么知道何时解决了对父控制器的承诺
- 在我的案例中,如何解决我的承诺问题
- 所有承诺解决后返回
- $.当承诺解决得太早时
- 如果你用另一个承诺解决一个承诺会发生什么
- 基于另一个承诺解决承诺
- 承诺解决不了问题
- 如何知道什么时候所有的承诺都被拒绝了,或者用基本的js承诺解决了
- Ember RSVP承诺解决firefox插件端口消息传递方案无法解决的模型
- 客户端等待服务器承诺解决
- while(true)循环中的承诺/等待承诺解决
- 推迟承诺解决
- 用承诺解决jQuery延迟
- 等待多个单独的承诺解决
- EmberJS - 在承诺解决后调用超级操作
- 如何为另一个承诺解决一个承诺
- 为什么我的承诺散列在传递的承诺解决之前就解决了?