javascript - 在调用 sendToDevice 之前,将 Promise.All 与 Firebase Cloud Fxs 结合使用,用 FCM token 填充数组

标签 javascript arrays firebase asynchronous firebase-cloud-messaging

我想知道是否有人可以帮助我了解如何在触发 sendToDevice() 之前成功执行此代码,直到整个数组都充满 FCM token 。

我一直在使用这些链接(如下所列)作为引用来尝试解决此问题,但我仍然无法弄清楚,所以唉,我在这里寻求指导。我只需要在 tokens 数组完全填满后传递它。我已经得到了它在每次 push 时多次触发的地方,但从未在异步加载然后触发的地方得到过><

Firebase Real Time Database Structure for File Upload

Promise.all with Firebase DataSnapshot.forEach

https://aaronczichon.de/2017/03/13/firebase-cloud-functions/

exports.sendVenueAnnouncement = functions.database.ref(`/venueAnnouncements/{venueUid}/announcement`).onCreate(event => {
  const venueUid = event.params.venueUid;
  const announcement = event.data.val();

  const getVenueDisplaynamePromise = admin.database().ref(`verifiedVenues/${venueUid}/displayname`).once('value');
  return getVenueDisplaynamePromise.then(snapshot => {
    const displayname = snapshot.val();
    const payload = {
      notification: {
        title: `${displayname}`,
        body: `${announcement}`
      }
    };
    const getSubscriberTokensPromise = admin.database().ref(`subscribers/${venueUid}`).once('value');
    return getSubscriberTokensPromise.then(snapshot => {
      const tokens = [];
      snapshot.forEach(function(childSnapshot) {
        const key = childSnapshot.key;
        const token = admin.database().ref(`pushTokens/` + key).once('value');
        tokens.push(token);
      });
      return Promise.all(tokens);
    }, function(error) {
      console.log(error.toString())
    }).then(function(values) {
      return admin.messaging().sendToDevice(values, payload).then(response => {
        const tokensToRemove = [];
        response.results.forEach((result, index) => {
          const error = result.error;
          if (error) {
            if (error.code === 'messaging/invalid-registration-token' || error.code === 'messaging/registration-token-not-registered') {
              tokensToRemove.push(tokensSnapshot.ref.child(tokens[index]).remove());
            }
          }
        });
        return Promise.all(tokensToRemove)
      });
    })
  })
})

最佳答案

几乎已经了解了 Promise。看来您还将回调与 Promise 混合在一起。 Firebase 和 Firebase 的 Cloud Functions 完全基于 Promise,因此没有必要。

话虽如此,您的代码应如下所示:

exports.sendVenueAnnouncement = functions.database
  .ref(`/venueAnnouncements/${venueUid}/announcement`)
  .onCreate(event => {
    const venueUid = event.params.venueUid
    const announcement = event.data.val()
    let payload
    let tokens = []

    return admin.database()
      .ref(`verifiedVenues/${venueUid}/displayname`)
      .once('value')
      .then(snapshot => {
        const displayname = snapshot.val()
        payload = {
          notification: {
            title: `${displayname}`,
            body: `${announcement}`
          }
        }
        return admin.database().ref(`subscribers/${venueUid}`).once('value')
      })
      .then(snapshot => {
        snapshot.forEach((childSnapshot) => {
          const key = childSnapshot.key
          const token = admin.database().ref(`pushTokens/` + key).once('value')
          tokens.push(token)
        })
        return Promise.all(tokens)
      })
      .then(values => {
        return admin.messaging().sendToDevice(values, payload)
      })
      .then(response => {
        const tokensToRemove = []
        response.results.forEach((result, index) => {
          const error = result.error
          if (error) {
            if (error.code === 'messaging/invalid-registration-token' || error.code === 'messaging/registration-token-not-registered') {
              tokensToRemove.push(tokensSnapshot.ref.child(tokens[index]).remove())
            }
          }
        })
        return Promise.all(tokensToRemove)
      })
  })

注意,我没有将 Promise 分配给变量。只需返回它并链接一个 then 即可。一个 Promise 可以返回另一个 Promise。

我建议观看this Firecast 可以更好地理解 Promise。

关于javascript - 在调用 sendToDevice 之前,将 Promise.All 与 Firebase Cloud Fxs 结合使用,用 FCM token 填充数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45286812/

相关文章:

Java-游戏 : Multiple instances

具有无法预定义的替代长度的 Python (NumPy) 数组

javascript - 一个<选项>有多个值

java - 在 android 中使用模型类时,Firestore FieldValue.ServerTimestamp 始终为空?

ios - Xcode Google 使用 Firebase 登录

javascript - 如何使用字符串 "watch"作为 JavaScript 关联数组中的键?

javascript - 正则表达式 - 在末尾匹配字符而不使用 $ 符号

Angular - 访问 'then' block 中的 ngrx 存储

javascript - 如何用 date-fns 格式化日期?

javascript - 基本的 create-react-app Jest 测试解释