【问题标题】:What's the proper way to return a promise in this triggered Cloud Function在这个触发的云函数中返回承诺的正确方法是什么
【发布时间】:2021-05-17 09:15:40
【问题描述】:

我知道对于触发函数,我必须始终返回一个承诺。看下面的例子:

//Example
exports.onAuthUserDelete = functions.auth.user().onDelete(async (user) => {
    let userId = user.uid;

    try {
        await firestore.collection('Users').doc(userId).delete();
        return Promise.resolve();
    } catch (error) {
        logger.error(error);
        return Promise.reject(error);
    }
});

我的问题是:

  1. return Promise.resolve() 是必需的还是我可以只做return firestore.collection('Users').doc(userId).delete()?如果我选择后者,如果命令失败会发生什么?还会触发catch()吗?
  2. 是否最好只使用以下模板启动每个函数以确保始终返回承诺?
//Is it better to start with this boilerplate
exports.onAuthUserDelete = functions.auth.user().onDelete(async (user) => {
    return new Promise((resolve, reject) => {
        //My code goes here...
    });
}

【问题讨论】:

    标签: node.js firebase promise google-cloud-functions


    【解决方案1】:

    Firestore 的 delete 操作已经返回了一个 Promise,因此无需创建您自己的 Promise。据我所知,第一个示例与以下示例相同:

    exports.onAuthUserDelete = functions.auth.user().onDelete((user) => {
        return firestore.collection('Users').doc(user.uid).delete();
    });
    

    鉴于此,我强烈建议使用上述较短的版本。

    【讨论】:

    • 我唯一的问题是,正如我在示例中所引用的,userId 可以是未定义的。因此,我试图在实际执行函数之前进行条件检查。
    • 您提供的代码没有进行检查,因此我的答案中也没有包含类似的内容。但即使使用if (user != null),您也不需要创建自定义承诺。如果没有要执行的异步操作,您可以立即返回一个值(实际上是任何值)。
    • @user3622260 你对此有进一步了解吗?
    • 嗨。感谢您的回复。我知道代码可以工作,但我认为我没有问题的答案。具体来说,如果我需要在之前进行一些检查和操作(如我的示例,简化),我想知道return Promise.resolve() 是否正确。这引出了我的第二个问题,如果将每个函数包装在 return new Promise() 包装器中仍然在编程上是正确的。我知道这不是必需的,但我需要知道这样做是否可以,以便我可以制定自己的编码标准。
    猜你喜欢
    • 2020-04-07
    • 1970-01-01
    • 2017-10-09
    • 2020-08-09
    • 2020-04-27
    • 2020-09-05
    • 1970-01-01
    • 2016-03-01
    • 1970-01-01
    相关资源
    最近更新 更多