我对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)阵列中的承诺得到解决)?
答案 0 :(得分:3)
我认为混淆来自于你说“因为getMovie(title)
在将每个承诺推入promises
数组之前解析了所有承诺”。
这不是正在发生的事情。注意return语句。 getMovie
函数立即返回Promise对象,并在稍后(通常)调用resolve(或reject)函数时解析,在这种情况下是异步调用之后。
所以它首先返回一个promise,然后在promise后解析(或拒绝)。 Promise.all等待一系列这些承诺来解决。
答案 1 :(得分:0)
当您致电Promise.all
时,数组已填充Promise
个对象。 Promise.all
相当于在所有承诺上调用.then
。当所有的承诺都得到解决,或者一个拒绝时,你的处理程序就会被调用。