0

我想知道是否有人可以帮助启发我如何成功地执行此代码,并等待整个阵列充满FCM标记在射击之前sendToDevice()使用Promise.All与Firebase Cloud Fxs在sendToDevice之前调用FCM标记之前调用

我一直在使用这些链接(列在下面)作为参考尝试和解决这个问题,但我仍然无法弄清楚,所以唉,我在这里寻求指导。一旦完全填充,我只需要通过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/

​​

回答

1

差不多了解诺言。看起来你也在将回调与Promises混合在一起。 Firebase的Firebase和云端功能完全基于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) 
     }) 
    }) 

通知我不分配承诺给一个变量。只要返回并链接then。一个承诺可以返回另一个承诺。

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

+0

非常感谢,弗朗西斯科!知道我是在了解他们的悬崖上,但却无法摆脱边缘。通常,我喜欢尽我所能自行解决问题,但我达到了让我感受到无法忍受的无奈的挫折感。感谢您花时间帮忙!我一定会给那个Firecast一块手表。 – AdamJosephNavarro

+0

得到实现你的建议代码,不幸的是仍然导致一个混乱的数组与每个推令牌深深地嵌套在一个对象中。与此链接中显示的内容类似:https://stackoverflow.com/questions/43647534/why-does-returning-snapshot-val-in-a-promise-when-using-promise-all-not-work – AdamJosephNavarro

相关问题