Promise.all()并了解它何时结算

时间:2016-09-13 17:16:06

标签: javascript node.js

我对node.js更新,并编写了一个需要承诺异步API调用的程序。我对我在研究中偶然发现的一些示例代码的执行有疑问。

下面的代码(根据我的理解)会命中一个API,等待响应,然后将该响应解析为一个承诺。这是迭代完成的,每个创建的promise都会传递给promises数组。最终Promise.all()在promises数组上调用.then()将执行更多代码迭代数组并将图像添加到页面。

function getMovie(title) {
  return new Promise(function(resolve, reject) {
  var request = new XMLHttpRequest();

  request.open('GET', 'http://mymovieapi.com/?q=' + title);
  request.onload = function() {
    if (request.status == 200) {
    resolve(request.response); // we get the data here, so resolve the Promise
    } else {
      reject(Error(request.statusText)); // if status is not 200 OK, reject.
    }
  };

    request.onerror = function() {
      reject(Error("Error fetching data.")); // error occurred, so reject the Promise
    };

    request.send(); // send the request
 });
}

function fetchMovies() {
  var titles = document.getElementById('titles').value.split(',');
  var promises = [];

  for (var i in titles) {
    promises.push(getMovie(titles[i])); // push the Promises to our array
  }

  Promise.all(promises).then(function(dataArr) {
    dataArr.forEach(function(data) {
    var img = JSON.parse(data)[0].poster.imdb;

    document.getElementById('movies').innerHTML =      document.getElementById('movies').innerHTML + '<img src="' + img + '"/>';
    });
  }).catch(function(err) {
    console.log(err);
  });
};
fetchMovies();

我在这里不理解的是Promise.all()如何等待所有API响应被推送到promises中。由于getMovie(title)在推送到promises数组之前解析了每个promise,因此不应该是推入的第一个已解决的promise会导致Promise.all()部分执行(作为1之1)阵列中的承诺得到解决)?

2 个答案:

答案 0 :(得分:3)

我认为混淆来自于你说“因为getMovie(title)在将每个承诺推入promises数组之前解析了所有承诺”。

这不是正在发生的事情。注意return语句。 getMovie函数立即返回Promise对象,并在稍后(通常)调用resolve(或reject)函数时解析,在这种情况下是异步调用之后。

所以它首先返回一个promise,然后在promise后解析(或拒绝)。 Promise.all等待一系列这些承诺来解决。

答案 1 :(得分:0)

当您致电Promise.all时,数组已填充Promise个对象。 Promise.all相当于在所有承诺上调用.then。当所有的承诺都得到解决,或者一个拒绝时,你的处理程序就会被调用。