为什么我的承诺散列在传递的承诺解决之前就解决了?

Why does my hash of promises resolve before passed promises resolve?

本文关键字:承诺 解决 我的 为什么      更新时间:2023-09-26

我已经使用承诺有一段时间了,但现在我偶尔会遇到我似乎无法解决的问题(没有双关语)。

我有一个文件数组,我必须为每个文件执行异步函数调用以获取一些元数据。

我使用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]),
 };