因此 Firebase Cloud Functions 必须最终全部返回 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);
}
});
在 JavaScript 中,所有异步函数都会返回一个 Promise。该规则没有例外。来自此文档(强调我的):
异步函数声明创建一个 AsyncFunction 对象。每次调用异步函数时,都会返回一个新的 Promise,该 Promise 将使用异步函数返回的值进行解析,或者因异步函数中未捕获的异常而被拒绝。
无论你是否明确返回一个承诺都不是问题。最终的返回值将隐式包装在 Promise 中(如果还不是 Promise)以满足规则。
因此,在异步函数中,这些代码具有完全相同的效果:
return true
return Promise.resolve(true)