Javascript 承诺。一切()并在解决问题时理解
我是node.js的新手,正在编写一个程序,该程序将需要异步API调用的承诺。关于我在研究中偶然发现的一些示例代码的执行,我有一个问题 下面的代码(据我所知)将命中一个API,等待响应,然后将该响应解析为承诺。这是迭代完成的,每个创建的承诺都被传递到一个承诺数组中。最后,在promises数组上调用Promise.all(),然后()将执行更多代码来迭代数组并将图像添加到页面中Javascript 承诺。一切()并在解决问题时理解,javascript,node.js,Javascript,Node.js,我是node.js的新手,正在编写一个程序,该程序将需要异步API调用的承诺。关于我在研究中偶然发现的一些示例代码的执行,我有一个问题 下面的代码(据我所知)将命中一个API,等待响应,然后将该响应解析为承诺。这是迭代完成的,每个创建的承诺都被传递到一个承诺数组中。最后,在promises数组上调用Promise.all(),然后()将执行更多代码来迭代数组并将图像添加到页面中 function getMovie(title) { return new Promise(function(re
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();
函数getMovie(标题){
返回新承诺(功能(解决、拒绝){
var request=new XMLHttpRequest();
request.open('GET','http://mymovieapi.com/?q="头衔",;
request.onload=函数(){
如果(request.status==200){
resolve(request.response);//我们在这里得到数据,所以要解决承诺
}否则{
拒绝(错误(request.statusText));//如果状态不是200 OK,则拒绝。
}
};
request.onerror=函数(){
拒绝(错误(“获取数据时出错”);//发生错误,因此拒绝承诺
};
request.send();//发送请求
});
}
函数fetchMovies(){
var titles=document.getElementById('titles').value.split(',');
var承诺=[];
用于(标题中的var i){
promises.push(getMovie(titles[i]);//将承诺推送到我们的数组中
}
Promise.all(promises.then)(函数(dataArr){
dataArr.forEach(函数(数据){
var img=JSON.parse(data)[0].poster.imdb;
document.getElementById('movies').innerHTML=document.getElementById('movies').innerHTML+'';
});
}).catch(函数(err){
控制台日志(err);
});
};
获取电影();
这里我不理解的是Promise.all()如何等待所有API响应被推送到promises中。由于getMovie(title)在将每个承诺推入承诺数组之前解析每个承诺,那么在调用
promise.all
时,是否应该是第一个解析的承诺会导致promise.all()部分执行(数组中的1个承诺已解析)的情况,数组中已填充了Promise
对象<代码>承诺。所有都相当于调用。然后对所有承诺执行
。当所有承诺都得到解决,或者有一个拒绝时,您的处理程序就会被调用。我认为混淆的地方在于您说“因为getMovie(title)
在将每个承诺推入承诺
数组之前解决了它”
事实并非如此。请注意return语句。getMovie
函数立即返回一个对象,并在稍后调用resolve(或reject)函数(通常是在异步调用之后)时解析
因此,它首先返回一个承诺,然后在稍后的时间该承诺得到解决(或拒绝)。并等待这些承诺的数组解析。调用了多少次
Promise.all(promises)
line?发生时,其参数数组中有多少项?回答这些问题,你会有所启发。)我想你误解了承诺的含义。立即创建promise对象,并通过thenable返回闭包。链的调用是同步进行的,但是解析会一个接一个地进行计算。在all中,添加到集合的每个承诺都会在解析时评估集合的状态。当它们全部解析时,状态转移到解析状态,数组的内容(第一个getMedia函数的结果)被传入。嗨,斯科特,如果您了解mongoose,这个链接可能会有所帮助