当前位置: 首页 > 面试题库 >

Promise.all()。then()解决吗?

令狐增
2023-03-14
问题内容

使用节点4.x。当您有Promise.all(promises).then()什么正确的方法来解析数据并将其传递给下一个.then()

我想做这样的事情:

Promise.all(promises).then(function(data){
  // Do something with the data here
}).then(function(data){
  // Do more stuff here
});

但是我不确定如何将数据发送到第二个.then()。我不能resolve(...)先用.then()。我知道我可以做到这一点:

return Promise.all(promises).then(function(data){
  // Do something with the data here
  return data;
}).then(function(data){
  // Do more stuff here
});

但这似乎不是执行此操作的正确方法…正确的方法是什么?


问题答案:

但这似乎不是正确的方法。

确实,这是执行此操作的正确方法(或者至少 执行此操作
正确方法)。这是Promise的关键方面,它们是一个管道,数据可以由管道中的各种处理程序处理。

例:

const promises = [

  new Promise(resolve => setTimeout(resolve, 0, 1)),

  new Promise(resolve => setTimeout(resolve, 0, 2))

];

Promise.all(promises)

  .then(data => {

    console.log("First handler", data);

    return data.map(entry => entry * 10);

  })

  .then(data => {

    console.log("Second handler", data);

  });

catch为简洁起见,省略了处理程序。在生产代码中, 始终 传播承诺或处理拒绝。)

我们从中看到的输出是:

第一把手[1,2]
二级处理者[10,20]

…因为第一个处理程序将两个promise(12)的分辨率作为一个数组,然后创建一个新数组,每个数组都乘以10并返回它。第二个处理程序获取第一个处理程序返回的内容。

如果您正在执行的其他工作是同步的,则还可以将其 放在 第一个处理程序中:

例:

const promises = [

  new Promise(resolve => setTimeout(resolve, 0, 1)),

  new Promise(resolve => setTimeout(resolve, 0, 2))

];

Promise.all(promises)

  .then(data => {

    console.log("Initial data", data);

    data = data.map(entry => entry * 10);

    console.log("Updated data", data);

    return data;

  });

…但是如果它是异步的,您将不想这样做,因为它最终会嵌套,并且嵌套会很快失去控制。



 类似资料:
  • 我对node.js比较熟悉,编写一个程序时需要承诺异步API调用。我有一个关于执行一些示例代码的问题,这是我在研究中偶然发现的。 下面的代码(根据我的理解)将访问一个API,等待响应,然后将该响应解析为承诺。这是迭代完成的,每个创建的承诺都被传递到一组承诺中。最终,对许诺数组调用promise.all()和.then(),将执行更多代码来迭代数组并将图像添加到页面中。 这里我不理解的是promis

  • 我试着去理解promise。所有这些都在使用async Wait的映射函数中,但我似乎返回了挂起的promise,我不明白为什么 这是工作代码,当我有一个.然后解决我的promise 哪个日志与预期一致=[2,3,4,5,6] 现在,为了实现使用async等待的功能,我知道我需要用关键字async包装异步函数中的函数,并等待promise.all 但我似乎总是记录下我的promise{

  • 问题内容: 使用node.js版本7.7.2,我要执行一个异步函数,然后在第一个函数完成后执行另一个函数,如下所示: 问题是此安装程序打印“栏已被开除”,然后打印“foo将要解决”。我期望的是,bar将等待触发,直到foo返回的promise被解决为止。我是否误解了then()如何将回调在node.js事件循环中排队? 谢谢 问题答案: 如注释中所述,将一个函数传递给该函数,当该函数被调用时,将使

  • 问题内容: 查看MDN看起来像传递给Promise的回调。all包含按promise顺序的值。例如: 谁能引用规范说明应该遵循的顺序? PS:运行这样的代码表明这似乎是对的,尽管这当然没有证据-可能是巧合。 问题答案: 不久, 订单被保留 。 按照您链接到的规范,将一个即支持该[接口的对象)作为参数,然后再调用它,后者使用循环。 这意味着,如果严格传递您传递给的迭代器,则一旦传递,它们仍将被订购。

  • 问题内容: 我编写了以下node.js文件: 如您所见,我为了等待读取csv文件的两种操作而使用。我不明白为什么,但是当我运行代码时,该行未提交。 我的第二个问题是我希望的回调函数接受两个不同的变量,而每个变量都是相关promise的结果。 问题答案: 第一个问题 兑现承诺 更改: 到(添加参数) 第二个问题 在与结果为每个传递给它的承诺数组缓解。 这意味着您可以将结果提取到如下变量中: 您可以使

  • 问题内容: 之间有什么区别: 还有这个 ? 我知道在第一个摘要中,所有的诺言都同时被兑现了,但是我不确定第二个。for循环是否等待第一次迭代完成以调用下一个promise?还是所有的诺言都在同一时间触发,循环的内部就像它们的回调一样? 问题答案: 是的,它们绝对不同。应该与异步迭代器一起使用,而不是与预先存在的promise数组一起使用。 为了清楚起见, 与…相同 要么 在等待任何事情之前,这些呼