我试图异步运行一个函数,但它会抛出错误。以下是我的代码:

exports.listenForNotificationRequests = functions.database.ref('/notificationRequests/{pushId}')
    .onWrite(event => {
       const requestId = event.data.val();
       var sentTo = requestId.sentTo;
       var senderIds =  sentTo.split(",");
     //  var senderTokens = "";

       var payload = {
                data: {
                  title: requestId.username,
                  message:  requestId.message,
                  sentFrom: requestId.sentFrom
                }
        };

       getSenderIds(senderIds).then(function(senderTokens){
            console.log("SenderTokens", senderTokens);
            admin.messaging().sendToDevice(senderTokens.split(","), payload)
                    .then(function(response) {
                      console.log("Successfully sent message:", response);
                    })
                    .catch(function(error) {
                      console.log("Error sending message:", error);
            });

       });

});

function getSenderIds(senderIds){
    var senderTokens = "";
    senderIds.forEach(function (snapshot){
                var ref = admin.database().ref("users/"+snapshot+"/token");
                console.log("refernce", snapshot);
                ref.once("value", function(querySnapshot2) {
                         var snapVal = querySnapshot2.val();
                         console.log("Token", snapVal);
                         senderTokens = senderTokens+","+snapVal;
                });
    });
    return senderTokens;
}

执行时抛出异常:
TypeError: getSenderIds(...).then is not a function
    at exports.listenForNotificationRequests.functions.database.ref.onWrite.event (/user_code/index.js:20:39)
    at /user_code/node_modules/firebase-functions/lib/cloud-functions.js:35:20
    at process._tickDomainCallback (internal/process/next_tick.js:129:7)

我试过多种方法,但都没有用。这里有人能指出我犯了什么错误吗?或者有其他解决办法吗?

最佳答案

要使用then(),getSenderIds()应该返回一个promise,而此时它返回一个字符串。
ref.once()返回一个承诺。您可以做的是使senderTokens成为一个数组,并为每个迭代将ref.once()推送到这个数组。
因为ref.once()返回一个promise,这使得senderTokens成为一个promises数组,它将包含每个查询的结果。然后您可以返回promise.all(sendertokens)read more about Promise.all here
然后在then(函数(senderTokens){})中执行to字符串处理
通过对senderTokens数组的每个项调用.val()来阻止。

10-01 03:33