【问题标题】:Can I chain a .then() after a forEach() array helper?我可以在 forEach() 数组助手之后链接一个 .then() 吗?
【发布时间】:2018-12-21 20:32:32
【问题描述】:

我可以这样做吗?

const array = ["foo", "bar", "hello", "etc"];

array.forEach(item => process(item)).then(() => {
    //run after forEach is done processing the whole array
});

【问题讨论】:

  • 嗨 Jamil,AFAIK,只有当流程返回承诺时,您才能这样做。
  • 如果process(item) 正在返回承诺,那么Promise.all 可以帮助您。
  • 不是原生的,但是 bluebird promises 可以做到这一点:bluebirdjs.com/docs/api/promise.each.html
  • 我不太确定你为什么要这样做? Array.forEach 是一种同步方法(即“同步”,而不是“异步”)。运行后它将在任何事情之前完全运行。 promises/.then 的重点是允许异步函数继续运行,而其余代码也继续运行。正如 Prakash Sharma 所说,如果 process 方法正在返回一个承诺,您需要将每个返回的承诺添加到一个数组中,并使用 Promise.all 附加一个 .then 回调,以便它们都完成。跨度>
  • 如果您告诉我们process(item) 做了什么/返回了什么,它会帮助人们给出好的答案。

标签: javascript asynchronous foreach callback


【解决方案1】:

没有。 then 用于处理承诺。 forEach 是同步的,因此您可能应该将已处理的项目保存在一个新数组中,然后立即执行后处理逻辑。

【讨论】:

    【解决方案2】:
    const values = ["foo", "bar", "hello", "etc"];
    Promise.all(values.map(process)).then((results)=>{
        //run after all promises are resolved
        console.log(results instanceof Array); // prints true
    });
    

    您可以使用Promise.all() 来解析promise 数组,并使用values.map(process) 为每个数组项执行process() 函数作为参数。

    【讨论】:

      【解决方案3】:

      如果您的意图是在 forEach 之后执行一些步骤,那么您可以通过顺序步骤来实现它(forEach 是同步)

      执行行 1

      const array = ["foo", "bar", "hello", "etc"];
      

      执行行 2

      array.forEach(item => process(item))
      

      执行行 3

      //Write your steps here to do after array.forEach
      

      【讨论】:

        猜你喜欢
        • 2012-06-12
        • 2017-10-16
        • 2022-06-29
        • 1970-01-01
        • 2013-07-07
        • 1970-01-01
        • 1970-01-01
        • 2011-02-28
        相关资源
        最近更新 更多