Javascript 如何使Firebase消息传递功能异步

Javascript 如何使Firebase消息传递功能异步,javascript,firebase,google-cloud-firestore,google-cloud-functions,Javascript,Firebase,Google Cloud Firestore,Google Cloud Functions,我有一个firebase消息传递函数,但返回函数似乎比其他函数先执行。以下是代码(抱歉,太长了): 我认为问题在于forEach不是异步的,所以最后一行代码是在等待forEach完成之前执行的。我最近在什么地方遇到了这个问题。你是对的,至少以我的经验来看:forEach似乎不遵守async指令。我不得不用来。。。在…语法中: 让它遵守异步(从父范围) 按顺序处理,因为当时顺序对我很重要 在您的情况下,它可能看起来像(收件人中的const recipient){…} 显然,这是由forEach在

我有一个firebase消息传递函数,但返回函数似乎比其他函数先执行。以下是代码(抱歉,太长了):


我认为问题在于forEach不是异步的,所以最后一行代码是在等待forEach完成之前执行的。我最近在什么地方遇到了这个问题。你是对的,至少以我的经验来看:
forEach
似乎不遵守
async
指令。我不得不用
来。。。在…
语法中:

  • 让它遵守
    异步
    (从父范围)
  • 按顺序处理,因为当时顺序对我很重要
  • 在您的情况下,它可能看起来像(收件人中的const recipient){…}


    显然,这是由
    forEach
    在不等待响应的情况下调用每个项的回调引起的。即使回调是异步的,
    forEach
    也不知道在每个循环上等待它的响应

    资料来源:


    上面链接的博客上的解决方案:

    await Promise.all(
      Object.keys(recipients).map(async recipient => {
        const devicesRef = db
          .collection('devices')
          .where('userId', '==', recipient);
        const devices = await devicesRef.get();
    
        devices.forEach(res => {
          const token: string = res.data().token;
          console.log(token);
          tokens.push(token);
        });
      });
    )
    

    注意,
    forEach
    已被一个
    map
    替换,它在
    承诺范围内。所有(…)
    。我最近在什么地方遇到了这个问题。你是对的,至少以我的经验来看:
    forEach
    似乎不遵守
    async
    指令。我不得不用
    来。。。在…
    语法中:

  • 让它遵守
    异步
    (从父范围)
  • 按顺序处理,因为当时顺序对我很重要
  • 在您的情况下,它可能看起来像(收件人中的const recipient){…}


    显然,这是由
    forEach
    在不等待响应的情况下调用每个项的回调引起的。即使回调是异步的,
    forEach
    也不知道在每个循环上等待它的响应

    资料来源:


    上面链接的博客上的解决方案:

    await Promise.all(
      Object.keys(recipients).map(async recipient => {
        const devicesRef = db
          .collection('devices')
          .where('userId', '==', recipient);
        const devices = await devicesRef.get();
    
        devices.forEach(res => {
          const token: string = res.data().token;
          console.log(token);
          tokens.push(token);
        });
      });
    )
    

    注意,
    forEach
    已被一个
    map
    替换,它在
    承诺范围内。所有(…)

    底线是您应该将所有承诺收集到一个数组中,然后使用Promise.all等待整个批处理。底线是您应该将所有承诺收集到一个数组中,然后使用Promise.all等待整个批处理。forEach并不是真正的“幼稚”。这就是lambda函数在JS中进行函数编程时的工作方式。谢谢Brian,现在它可以完美地工作了。我只需要去掉最后一个分号,因为TS抱怨Foreach并不是真的“幼稚”。这就是lambda函数在JS中进行函数编程时的工作方式。谢谢Brian,现在它可以完美地工作了。我只需要去掉最后一个分号,因为TS在抱怨