javascript - promise 的正确解决方案

标签 javascript node.js es6-promise google-cloud-firestore

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

如何在 promise 中调用函数 getOrSetUserTrackDay(day) 以获得良好的值(value),但不是未定义的?

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 - 但是,由于它包含异步代码,您将永远无法同步使用它

所以,您可以执行以下操作

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 从函数声明更改为函数表达式(在本例中,无特殊原因的箭头函数)- 因为 函数声明不应放在 block 。使用函数表达式或将语句移动到外部函数的顶部。

关于javascript - promise 的正确解决方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46907711/

相关文章:

javascript - ReactJS 和 setState 语法

c# - JavaScript 函数不工作

node.js - 在 NodeJS 中异步使用同步进程

CentOS 6 上的 Node.js 0.12.0(按 rpm)

javascript - 如何将旧的 JavaScript API 转换为 Promise

javascript - 在 Ramda 管道中使用 Promise.all

javascript - Node.js:从用户位置选择 DigitalOcean 城市

javascript - 如何从 URL 读取 JSON 响应并使用 Javascript 中的键和值(数组内的数组)

javascript - vscode 响铃键盘快捷键

node.js - 如何将 Intellisense 文件导入 vsCode (Visual Studio Code)