代码之家  ›  专栏  ›  技术社区  ›  lurning too koad

在返回Promise的同时,从Firebase Cloud函数返回布尔值的正确方法是什么?

  •  0
  • lurning too koad  · 技术社区  · 1 年前

    因此,Firebase Cloud函数最终都必须返回承诺。如果我们处理的是一个可调用函数,而客户端希望从该函数中获得一个布尔值,我们是简单地返回一个用该布尔值解析的promise,还是只返回该布尔值?

    exports.doesUserExistAtPhoneNumber = onCall(async (request) => {
        const phoneNumber = request.data.phoneNumber;
    
        try {
            const db = getFirestore();
            const snapshot = await db.collection("userAccounts").where("phoneNumber", "==", phoneNumber).get();
    
            if (snapshot.empty) {
                // There is NO EXISTING user at this phone number.
                return Promise.resolve(false);
            } else {
                // There is INDEED AN EXISTING user at this phone number.
                return Promise.resolve(true);
            }
        } catch (error) {
            throw new HttpsError("unknown", error);
        }
    });
    
    1 回复  |  直到 1 年前
        1
  •  1
  •   Doug Stevenson    1 年前

    在JavaScript中,所有异步函数都返回一个promise。这条规则没有例外。从…起 this documentation (强调我的):

    异步函数声明创建一个异步函数对象。每次调用异步函数时, 它返回一个新的Promise,该Promise将使用async函数返回的值进行解析 ,或者在异步函数中被拒绝并出现未捕获的异常。

    你是否明确地返回承诺不是问题。为了满足规则,最终的返回值将隐含地包装在promise中(如果还不是promise的话)。

    因此,在异步函数中,这些代码位具有完全相同的效果:

    1. return true

    2. return Promise.resolve(true)

    作为开发人员,您在代码中必须做的主要事情是确保所有承诺都在执行过程中等待或返回。有eslint规则可以帮助您跟踪这一点。如果不这样做,可能会导致意外行为,因为在交付最终承诺时,云功能会关闭。

    推荐文章