我正在尝试实现要发送给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;
});
})]);
}