为什么我的哈希承诺在通过promises之前解决了?

时间:2015-06-02 10:12:44

标签: javascript asynchronous promise rsvp.js

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

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

我使用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;
&#13;
&#13;

2 个答案:

答案 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]),
 };