我应该在Firebase云功能中等待Firestore设置呼叫吗

时间:2020-06-01 15:21:13

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

假设我有这样的云功能

export const setData = functions.https.onCall(async (data, context) => {
    await admin.firestore().doc("myPath").set({data: "myData"})
    return {success: true}
})

如果我不在乎Firestore Set调用是否成功, 我可以删除等待吗?因此该函数可以更早返回并减少CPU使用时间。

export const setData = functions.https.onCall(async (data, context) => {
    admin.firestore().doc("myPath").set({data: "myData"})
    return {success: true}
})

2 个答案:

答案 0 :(得分:1)

如果删除等待,将会遇到问题。如果没有它,该函数将立即以返回值返回,而无需等待set()完成。该功能将与所有尚未完成的异步工作一起终止。

对于可调用函数,该函数必须返回一个仅在所有异步工作完成后才能解析的承诺。在您的情况下,使用await关键字即可实现。

答案 1 :(得分:0)

这比Firebase本身更像JS问题。

如果您真的不在乎,那没问题,但是即使您可以正常调用该函数作为返回,您也从不知道是否返回了任何内容可能只是在Firebase调用完成之前完成所有操作。

“返回得更早,减少了CPU使用时间。”

使用更少的CPU可能只是信号,表明您的功能无法正常工作。

此外,Firebase确实是快速且可扩展的,我总是建议使用then/catch来保持执行并捕获错误,甚至只是出于日志目的。像这样:

admin.firestore().doc("myPath").set({data: "myData"}).then(response => {
    return whateverYouWant(response)
}).catch(err => {
    return handleWhateverError(err)
})

此外,如果该函数中不再包含async,则无需保留await