Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/421.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 承诺。一切()并在解决问题时理解_Javascript_Node.js - Fatal编程技术网

Javascript 承诺。一切()并在解决问题时理解

Javascript 承诺。一切()并在解决问题时理解,javascript,node.js,Javascript,Node.js,我是node.js的新手,正在编写一个程序,该程序将需要异步API调用的承诺。关于我在研究中偶然发现的一些示例代码的执行,我有一个问题 下面的代码(据我所知)将命中一个API,等待响应,然后将该响应解析为承诺。这是迭代完成的,每个创建的承诺都被传递到一个承诺数组中。最后,在promises数组上调用Promise.all(),然后()将执行更多代码来迭代数组并将图像添加到页面中 function getMovie(title) { return new Promise(function(re

我是node.js的新手,正在编写一个程序,该程序将需要异步API调用的承诺。关于我在研究中偶然发现的一些示例代码的执行,我有一个问题

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

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,这个链接可能会有所帮助