功能在承诺结束之前完成

时间:2019-02-12 12:05:55

标签: node.js ecmascript-6 google-cloud-functions

我正在尝试实现要发送给200个用户的推送通知,然后处理sendToDevice()的结果所使用的actualSendPush函数。问题是,即使我用Promise包装了所有异步代码,云函数仍然在sendToDevice()。的console.log.then执行之前完成。一些推送通知也没有到达目的地。

在调用ActualSendPush时,我也在使用Promise。这段代码有什么缺陷?

function actualSendPush(fcmKey, volId, title, msg, evtId, orgId, url){

const promises = [];

console.log("notifying user about msg ", fcmKey, " ", msg);

const payload = {
    notification: {
        title: "Help Required",
        body: title,
        sound:"default",
        click_action: "FLUTTER_NOTIFICATION_CLICK"
    },
    data: {
            title : title,
            msg : msg,
            eventId : evtId
          }
};

return Promise.all([admin.messaging().sendToDevice(fcmKey, payload)
    .then(function (response) {


        // event push success counter 
        if (response.successCount == 1)
        {
            console.log("Successfully sent message:", response);
            promises.push(incrementTransaction("events/" + orgId + "/" + evtId + "/numEventsSendSuccess"));
        }
        else
        {
            console.log("Failed sent message:", response);
            promises.push(incrementTransaction("events/" + orgId + "/" + evtId + "/numEventsSendFail"));
        }

        /*var updates = {};
        updates["eventUserReqs/" + orgId + "/" + evtId + "/users/" + volId + "/status"] = response.successCount; // 0 failed 1 success
        admin.database().ref().update(updates);*/

        // The user might have opened the push before the server side had the chance to change the status to successful or not.. if it 
        // already has a value, don't change it.
        var dbRef = admin.database().ref("eventUserReqs/" + orgId + "/" + evtId + "/users/" + volId + "/status");

        promises.push(dbRef.transaction(function (current_value) {
          return current_value != null ? current_value : (response.successCount);
        }));

        return Promise.all(promises);
    })
    .catch(function (error) {
        console.log("Error sending message:", error);

        // event push fail counter
        incrementTransaction("events/" + orgId + "/" + evtId + "/numEventsSendFail");

        var dbRef = admin.database().ref("eventUserReqs/" + orgId + "/" + evtId + "/users/" + volId + "/status");
        return dbRef.transaction(function (current_value) {
          return current_value != null ? current_value : 0;
        });
    })]);
}

0 个答案:

没有答案