承诺的正确解决scheme

我有连接到firebase的node.js上的应用程序。 我需要正确更新数据。

如何在函数getOrSetUserTrackDay(day)中调用promise来获得一个很好的值,但不是undefined?

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没有返回语句,因此它返回undefined – 但是,因为它包含asynchronous代码,你永远不能同时使用它

所以,你可以做到以下几点

 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从函数声明更改为函数expression式(在这种情况下,没有特殊原因的箭头函数) – 因为Function declarations should not be placed in blocks. Use a function expression or move the statement to the top of the outer function. Function declarations should not be placed in blocks. Use a function expression or move the statement to the top of the outer function.