node.js - node.js async 承诺顺序执行
问题描述
我正在尝试使用 node.js 编写 Firebase 函数
在下面的代码中,当消息数据库中有新条目时,会触发“pushNotifications”函数。
从messagesDB 我从messages 字典中获取电子邮件。
- 使用电子邮件地址调用函数 getUserID() 以获取 UID
- 收集的 UID 然后将其传递给 getUserStatus(uid) 并获取返回布尔值的当前状态。
如果没有用户的 uid,我将无法获得用户的状态,并且需要按顺序执行。
(我可以使用硬编码值单独执行它们,但不能按顺序执行)任何帮助都将不胜感激。
function getUserStatus(uid) {
var onlineStatus = true;
console.log('getting the status.........', uid);
return firestoreDB.collection('userstatus').doc(uid).get()
.then(doc => {
if (doc.exists) {
onlineStatus = doc.data()['online'];
}
return onlineStatus;
})
.catch(err => {
return err;
});
}
function getUserID(toId) {
var uid;
console.log('get uid function....');
return admin.auth().getUserByEmail(toId)
.then((userRecord) => {
console.log('record :', userRecord);
uid = userRecord.uid
console.log('uid :', uid);
console.log(`getting document`);
return uid;
})
.catch((error) => {
console.log("Error fetching getUserID :", error);
return err;
})
}
exports.pushNotifications = functions.database.ref('/Messages/{messageID}').onWrite(event => {
console.log('event Data : ', event.after._data);
const data = event.after._data;
const fromId = data.from;
const toId = data.to;
const message = data.messageText;
console.log(fromId + ' sent a message to ' + toId);
console.log('getting uid..');
const statusOnline = getUserID(toId)
.then(uid => {
console.log('got uid', uid);
getUserStatus(uid)
})
.then(status => {return status})
.catch(err => console.log('Error executing the promises', err.message));
console.log('statusOnline : ', statusOnline);
console.log('Done.......');
});
解决方案
您缺少返回语句,因此下面的承诺没有收到任何输出。
const statusOnline = getUserID(toId)
.then(uid => {
console.log('got uid', uid);
return getUserStatus(uid); // return your result
})
.then((status) => .... )
而且您并没有真正对自己的身份做任何事情。console.log(status)
收到状态后尝试。
.then(status => {
console.log("the status obtained was ", status);
return status
})
并且承诺在您使用它们时不起作用。通过将变量设置为 Promise,您不能简单地在其执行完成之前对其输出进行控制台记录。所以不要console.log('statusOnline : ', statusOnline);
做这样的事情
statusOnline.then(result => {console.log('statusOnline : ', result)});
推荐阅读
- r - 如何为闪亮列表中的单个列表元素渲染数据表或渲染表
- excel - 计数返回 0 的 Sumproduct
- mysql - 没有使用 spring boot 和 jpa 在多方关系中添加实体
- swift - 为什么 UITextView 滚动在 tvOS 上不起作用?
- c# - 如何通过 Bot Framework 向 Teams 中的用户发送通知?
- kubernetes - K8S Cron 作业从 config-map 读取环境特定值
- javascript - 使用 javascript 动态移动谷歌地图标记
- java - 有没有办法在 VS Code 中获取 Exclipse 的(tomcat-)服务器插件功能?(自动部署分解的 WAR 文件等。)
- mysql - SELECT MAX(...) 在存储过程中错误地返回 NULL
- react-native - 循环嵌套对象反应原生