当前位置: 首页 > 知识库问答 >
问题:

promise.all()和理解

姬慎之
2023-03-14

我对node.js比较熟悉,编写一个程序时需要承诺异步API调用。我有一个关于执行一些示例代码的问题,这是我在研究中偶然发现的。

下面的代码(根据我的理解)将访问一个API,等待响应,然后将该响应解析为承诺。这是迭代完成的,每个创建的承诺都被传递到一组承诺中。最终,对许诺数组调用promise.all()和.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();

这里我不理解的是promission.ALL()是如何等待所有API响应被推送到promissions中的。由于getMovie(title)在将每个承诺推入Promissions数组之前会对其进行解析,所以是否应该这样做:推入的第一个解析的Promissions会导致promission.all()部分执行(因为数组中1个承诺中的1个被解析)?

共有2个答案

闻人栋
2023-03-14

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

张晨朗
2023-03-14

我认为当您说“因为getMovie(title)在将每个承诺推入Promission数组之前就会解析它”时,就会产生混乱。

这不是正在发生的事情。注意return语句。getmovie函数立即返回一个Promise对象,并在稍后(通常)调用resolve(或reject)函数时进行解析,在本例中是在异步调用之后。

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

 类似资料:
  • 我可以看到promise没有实现,因为返回的数组包含适当的拒绝promise。 有人能告诉我为什么不调用吗?(如果我在中有一个promise数组,其中一个被拒绝,我就知道是这样)

  • 问题内容: 我有一个类似结构的数组,它公开了异步方法。异步方法调用返回数组结构,从而返回更多异步方法。我正在创建另一个JSON对象来存储从该结构获得的值,因此我需要注意跟踪回调中的引用。 我已经编写了一个蛮力解决方案,但是我想学习一个更惯用或干净的解决方案。 对于n级嵌套,该模式应该是可重复的。 我需要使用promise.all或一些类似的技术来确定何时解析封闭例程。 并非每个元素都必然涉及进行异

  • 我有一个类似数组的结构,它公开异步方法。async方法调用返回数组结构,这些结构反过来公开更多的异步方法。我正在创建另一个JSON对象来存储从这个结构中获得的值,因此我需要小心跟踪回调中的引用。 我已经编写了一个暴力解决方案,但我想学习一个更惯用或干净的解决方案。 该模式应可重复n个嵌套级别 这是部分代码-

  • 问题内容: 我有一系列要解决的承诺 我继续继续诺言链。看起来像这样 我想添加一个catch语句来处理单个promise,以防万一出错,但是当我尝试时,返回它发现的第一个错误(忽略其余的),然后我无法从其余的promise中获取数据数组(没有错误)。 我尝试做类似.. 但这并不能解决。 谢谢! - 编辑: 下面的答案完全正确,但代码由于其他原因而中断。如果有人感兴趣,这就是我最终得到的解决方案… 节

  • 本文向大家介绍Promise.all中对于reject的处理方法,包括了Promise.all中对于reject的处理方法的使用技巧和注意事项,需要的朋友参考一下 昨天写了个小爬虫,用axios.all同时请求多个页面时,国内网络的原因很容易就超时然后reject了,佛系resolve不可取啊,然后想到可以实现一个“重发失败请求”的功能。 Promise.all(requestPromises).

  • 问题内容: 使用节点4.x。当您有什么正确的方法来解析数据并将其传递给下一个? 我想做这样的事情: 但是我不确定如何将数据发送到第二个。我不能先用。我知道我可以做到这一点: 但这似乎不是执行此操作的正确方法…正确的方法是什么? 问题答案: 但这似乎不是正确的方法。 确实,这是执行此操作的正确方法(或者至少 是 执行此操作 的 正确方法)。这是Promise的关键方面,它们是一个管道,数据可以由管道