【问题标题】:Firebase making sure async functions are completedFirebase 确保异步功能已完成
【发布时间】:2018-01-24 00:34:20
【问题描述】:

如何确保我的.remove 通话已完成?我对下面的代码是否正确?最近我遇到了一个根本没有完成这个功能的案例。那么你能解释一下异步调用吗?谢谢。

exports.UserDelete = functions.auth.user().onDelete(event => {
    var uid = event.data.uid;
    admin.database().ref("notes/" + uid).remove();
    admin.database().ref("users/" + uid).remove();
    admin.database().ref("providers/" + uid).remove();
    return null;
});

【问题讨论】:

    标签: firebase firebase-realtime-database google-cloud-functions


    【解决方案1】:

    您必须从您的函数返回一个承诺,该承诺在所有异步工作完成后解决。了解异步编程的工作原理是critical for using Cloud Functions。对remove() 的每个调用都会返回一个promise,因此您需要将它们全部收集到一个数组中并将它们传递给Promise.all() 以获得另一个在所有工作完成后解决的promise。

    exports.UserDelete = functions.auth.user().onDelete(event => {
        const uid = event.data.uid;
        const p1 = admin.database().ref("notes/" + uid).remove();
        const p2 = admin.database().ref("users/" + uid).remove();
        const p3 = admin.database().ref("providers/" + uid).remove();
        return Promise.all([p1, p2, p3]);
    });
    

    【讨论】:

    • 空数组return Promise.all([]);调用可以吗?
    • @KonstantinKonopko 我链接到的 Promise.all() 文档解决了您的问题:返回值 - 如果传递的迭代为空,则已解决的 Promise。
    【解决方案2】:

    当您在 firebase-function 中处理 async 任务时,您应该返回 Promise

    结帐this

    var uid = event.data.uid;
    
    return admin.database().ref("notes/" + uid).remove()
    .then(() => admin.database().ref("users/" + uid).remove())
    .then(() => admin.database().ref("providers/" + uid).remove())
    

    【讨论】:

    • 谢谢,这种方法也不错,但最佳答案更优雅
    猜你喜欢
    • 2016-09-06
    • 2020-04-02
    • 2021-08-13
    • 2021-06-02
    • 1970-01-01
    • 2019-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多