Javascript 承诺的正确解决方案
我在node.js上有一个连接到firebase的应用程序。我需要正确地更新数据 如何在promise中调用函数getOrSetUserTrackDay(day),以获得一个好的值,但不是未定义的值Javascript 承诺的正确解决方案,javascript,node.js,es6-promise,google-cloud-firestore,Javascript,Node.js,Es6 Promise,Google Cloud Firestore,我在node.js上有一个连接到firebase的应用程序。我需要正确地更新数据 如何在promise中调用函数getOrSetUserTrackDay(day),以获得一个好的值,但不是未定义的值 let userData = []; let userID = req.params.userID; let today = req.params.today; let yesterday = req.params.yesterday; db.collection('users').doc(us
let userData = [];
let userID = req.params.userID;
let today = req.params.today;
let yesterday = req.params.yesterday;
db.collection('users').doc(userID).get()
.then((userDataFromDB) => {
if (!userDataFromDB.exists) {
res.status(404).send('User not found');
}
else {
function getOrSetUserTrackDay(day) {
let userTrackRef = db.collection('history').doc('daily').collection(day).doc(userID);
userTrackRef.get()
.then(userTrackData => {
if (userTrackData.exists) {
return userTrackData.data(); // good
}
else {
let userNewData = {
username: userDataFromDB.data().username,
photoUrl: userDataFromDB.data().photoUrl
};
userTrackRef.update(userNewData);
return userNewData; // good
}
})
}
userData = {
user: userDataFromDB.data(),
today: getOrSetUserTrackDay(today), // undefined
yesterday: getOrSetUserTrackDay(yesterday) // undefined
};
res.json(userData);
}
})
.catch((err) => {
console.log(err);
res.status(404).send(err);
});
当然,
getOrSetUserTrackDay
没有返回语句,因此它返回未定义的
——但是,由于它包含异步代码,您永远无法同步使用它
因此,您可以执行以下操作
let userData = [];
let userID = req.params.userID;
let today = req.params.today;
let yesterday = req.params.yesterday;
db.collection('users').doc(userID).get()
.then((userDataFromDB) => {
if (!userDataFromDB.exists) {
res.status(404).send('User not found');
}
else {
let getOrSetUserTrackDay = day => {
let userTrackRef = db.collection('history').doc('daily').collection(day).doc(userID);
return userTrackRef.get()
.then(userTrackData => {
if (userTrackData.exists) {
return userTrackData.data(); // good
} else {
let userNewData = {
username: userDataFromDB.data().username,
photoUrl: userDataFromDB.data().photoUrl
};
userTrackRef.update(userNewData);
return userNewData; // good
}
});
};
Promise.all([getOrSetUserTrackDay(today), getOrSetUserTrackDay(yesterday)])
.then(([today, yesterday]) => res.json({
user: userDataFromDB.data(),
today,
yesterday
}));
}
}).catch((err) => {
console.log(err);
res.status(404).send(err);
});
注意:将
getOrSetUserTrackDay
从函数声明更改为函数表达式(在本例中,是一个箭头函数,没有特殊原因)-因为函数声明不应放在块中。使用函数表达式或将语句移动到外部函数的顶部。
wellgetOrSetUserTrackDay
没有返回语句,因此它返回未定义的
——但是,由于它包含异步代码,您将永远无法同步使用它lyGet error(节点:5212)未处理的PromisejectionWarning:未处理的承诺拒绝(拒绝id:2):TypeError:undefined不是函数(节点:5212)[DEP0018]弃用警告:未处理的承诺拒绝已弃用。将来,未处理的承诺拒绝将使用非零退出代码终止Node.js进程。。。复制/粘贴是一个诅咒-现在编辑-不过,你肯定应该把它添加回去“\_(ツ)_/“-再看一遍…我的部分肯定有一些输入错误,或者是“未定义的不是函数”…winder哪个函数已成为未定义的