Promise.all()和理解什么时候解决

我更新Node.js和编写一个程序,将要求承诺的asynchronousAPI调用。 我有一个关于执行我在研究中偶然发现的一些示例代码的问题。

下面的代码(从我的理解)将打击一个API,等待响应,然后解决该答复作为承诺。 这是迭代完成的,每个创build的promise都被传递给一个promise数组。 最后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响应被推入承诺。 由于getMovie(title)在被推入Promise数组之前parsing了每个promise,不应该是第一个被parsing的Promise被push入的Promise.all()部分执行的情况(作为1中的1个promise数组解决了)?

我认为混淆的地方在于你说“因为getMovie(title)在被推入promises数组之前解决了每一个承诺”。

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

所以它首先返回一个承诺,然后在稍后的时间承诺解决(或拒绝)。 和Promise.all等待这些承诺的数组解决。

当你调用Promise.all ,数组已经填充了Promise对象。 所有的承诺都是相等的。 当所有的承诺都解决了,或者一个拒绝了,你的处理程序就会被调用。