javascript-如何在Promise和forEach中使用Firebase Cloud Functions?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了javascript-如何在Promise和forEach中使用Firebase Cloud Functions?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4102字,纯文字阅读大概需要6分钟。
内容图文
![javascript-如何在Promise和forEach中使用Firebase Cloud Functions?](/upload/InfoBanner/zyjiaocheng/686/8cdd9cb7418e4ab5badc5f90ea6650c7.jpg)
我正在尝试在这里做两件事.
1)向所有员工发送通知. 2)将特定参考复制到
员工编号参考如果不存在特殊参考,我将复制常规参考.
该程序运行无错误.保持完美.但是有时我在Notifications代码部分收到Timed out错误.
Error: fcm.googleapis.com network timeout. Please try again.
将一个引用复制到另一个引用的代码始终有效,并且从未在该位置收到错误.
我觉得错误是由于无法正确使用forEach处理promises所致.您能否通过正确放置Promises来使我的代码完美执行?
exports.myFunc = functions.https.onRequest( (request, response) => {
admin.database().ref('/Employees').once('value').then(function(snap) {
snap.forEach(function (snapshot) {
var obj = snapshot.val();
if(obj.department){//only go ahead if dept is present
console.log(' : ' + obj.department);
var id, tkid, dept;
id = obj.empId; tkid = obj.tokenId; dept = obj.department;
var welcomeStr="hello! Welcom to our Department";
//================================================================notifications
var payload = {
data: {
greeting: welcomeStr,
to_who: id
}
};
admin.messaging().sendToDevice(tkid,payload)
.then(function(response){
console.log("Successfully sent message: ", response);
})
.catch(function(error){
console.log("Error sending message: ", error);
})
//===================================================Ref copying
var destinationRef = admin.database().ref('/Employees/' + id);//final destination
var option2Ref = admin.database().ref('/Company/General');//when special doesnt exist
var option1Ref = admin.database().ref('/Company/Special');//if special exists
option1.once('value', function(snapshot1){
if (snapshot1.exists()){//copy from straing from option11 to Employees/id
option1.once('value', function(snap) {
destinationRef.set( snap.val(), function(error) {
if( error && typeof(console) !== 'undefined' && console.error ) { console.error(error); }
console.log('DONE .... ' + id);
});
});
}
else{//we need to copy from option2 to Employees/id
option2Ref.once('value', function(snap) {
newRef.set( snap.val(), function(error) {
if( error && typeof(console) !== 'undefined' && console.error ) { console.error(error); }
console.log('DONE .... ' + id);
});
});
}
});
}
else{
console.log('No Department: ' + obj.dept);
return;
}
});
});
response.send("WOKAY!");
});
解决方法:
在这里,我已经重写了您的代码,以期清理复杂的Promise链
信守诺言是最常见且最难调试的问题之一,我看到了我应得的份额
对代码的重要更改:
>现代异步语法
>使承诺更干净
>使用Promise.all代替forEach
>这样,每一个诺言都在等待而不被遗忘
>(希望)所有的诺言都能正确地归还
>所有快照操作均同时运行,并且onRequest处理程序应等待它们全部完成后再终止
>使用一次Promise并设置而不是回调
>我不确定这些是什么库
>看起来他们接受基于承诺的用法
>因此,我取消了回调的使用,以保证promise
>请查看TODO标记
>不确定要用于其他块的内容,因此请务必对其进行修补
async function handleSnapshot(snapshot) {
const {empId, tokenId, department} = snapshot.val()
// only go ahead if dept is present
if (!department) throw new Error("no department")
console.log("department:", department)
//================================================================notifications
const payload = {
data: {
greeting: "Hello! Welcome to our Department",
to_who: empId
}
}
const response = await admin.messaging().sendToDevice(tokenId, payload)
console.log("successfully sent message", response)
//===================================================Ref copying
const destinationRef = admin.database().ref('/Employees/' + empId) // final destination
const option2Ref = admin.database().ref('/Company/General') // when special doesnt exist
const option1Ref = admin.database().ref('/Company/Special') // if special exists
const snapshot1 = await option1Ref.once("value")
// copy from string from option1 to Employees/id
if (snapshot1.exists()) {
await destinationRef.set(snapshot1.val())
console.log("DONE1...", empId)
}
// TODO review this block
// we need to copy from option2 to Employees/id
else {
const snapshot2 = await option2Ref.once("value")
await destinationRef.set(snapshot2.val())
console.log("DONE2...", empId)
}
}
exports.myFunc = functions.https.onRequest(async(request, response) => {
const snapshots = await admin.database().ref('/Employees').once('value')
await Promise.all(snapshots.map(handleSnapshot))
response.send("WOKAY!")
})
内容总结
以上是互联网集市为您收集整理的javascript-如何在Promise和forEach中使用Firebase Cloud Functions?全部内容,希望文章能够帮你解决javascript-如何在Promise和forEach中使用Firebase Cloud Functions?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。