【问题标题】:How to use Async/Await to hold the execution? [closed]如何使用 Async/Await 来保持执行? [关闭]
【发布时间】:2020-02-16 15:39:44
【问题描述】:

我正在尝试根据某些参数的验证来获取用户 ID。问题是代码没有按正确的顺序!!

执行

输出是

  1. KlFHdAgDUUUIKaPeObs9RiSBlOp1
  2. 通知正确
  3. 动物真实

输出应该是

  1. 通知正确
  2. 动物真实
  3. KlFHdAgDUUUIKaPeObs9RiSBlOp1
exports.bulkMsg = functions.firestore
    .document('/bulkMsgs/{bulkMsgsId}').onUpdate(async(snap, context) => {

        function processBulKMsg(onUsers) {
            anPromises = [];
            notPromises = [];

            onUsers.forEach((oneUser) => {
                var status = false;
                if (oneUser.id === 'KlFHdAgDUUUIKaPeObs9RiSBlOp1') {


                    const onNot = admin.firestore().collection('users').doc(oneUser.id).collection('notifications').get().then(oneNot => {
                        if (notNumStatus === true) {
                            if ((oneNot.size >= notNumMin) && (oneNot.size <= notNumMax)) {
                                status = status ? true : false;
                            } else {
                                status = false;
                            }
                        }
                        console.log('Notifications', status);
                        return oneNot;
                    }).catch(err => {
                        console.log('Error getting notifications', err);
                        return null;
                    });

                    notPromises.push(onNot);


                    const allAn = admin.firestore().collection('users').doc(oneUser.id).collection('animals').get().then(oneAn => {
                        if (anCountStatus === true) {
                            if ((oneAn.size >= inFarmMin) && (oneAn.size <= inFarmMax)) {
                                status = status ? true : false;
                            } else {
                                status = false;
                            }
                        }
                        console.log('Animals', status);
                        return oneAn;
                    }).catch(err => {
                        console.log('Error getting animals', err);
                        return null;
                    });

                    anPromises.push(allAn);

                    if (status) {
                        console.log(oneUser.id);
                    }

                }
            });
            return Promise.all([anPromises, notPromises]);
        }

        return admin.firestore().collection('users/')
            .where("notification", "==", "true")
            .get().then(onUsers => {
                return processBulKMsg(onUsers);
            }).catch(err => {
                console.log('Error getting user', err);
                return null;
            });

    });

【问题讨论】:

  • 从您描述的行为来看,您的异步操作之一未得到正确处理。但是这段代码中发生的事情太多了,我无法快速扫描你到底哪里出错了。请用更少的代码重现问题,以便我们更有可能帮助找出问题所在。另请参阅how to create a minimal, complete, verifiable example
  • @FrankvanPuffelen - 感谢您的回复。我已经编辑了原始帖子并最小化了代码。谢谢

标签: typescript firebase google-cloud-firestore google-cloud-functions


【解决方案1】:

代码按预期工作。数据从 Firestore 异步加载,在加载数据时,您的主代码路径会继续执行。

此代码位于您的processBulKMsg 函数的主代码路径中:

if (status) {
    console.log(oneUser.id);
}

所以当你调用processBulKMsg 时,这个console.log 会立即打印出来。如果你想稍后记录用户 ID,你应该只在 promise 解决后调用它。像这样的

return admin.firestore().collection('users/')
    .where("notification", "==", "true")
    .get().then(onUsers => {
        let result = processBulKMsg(onUsers);
        console.log(oneUser.id);
        return result;
    })...

或者,您可以将oneUser.id 添加到承诺数组中,然后从那里使用它。

所以在processBulKMsg,你会这样做:

...
return Promise.all([anPromises, notPromises, oneUser.id]);

然后

return admin.firestore().collection('users/')
    .where("notification", "==", "true")
    .get().then(onUsers => {
        let result = processBulKMsg(onUsers);
        console.log(result[result.length -1]);
        return result;
    })...

【讨论】:

  • 非常感谢您的回复!是的,我必须将 oneUser.Id 排列并在 forEach 之后使用延迟。
猜你喜欢
  • 1970-01-01
  • 2019-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-23
  • 1970-01-01
  • 2017-06-30
相关资源
最近更新 更多