在云函数中返回承诺

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在云函数中返回承诺相关的知识,希望对你有一定的参考价值。

我正在尝试观察给定ref的任何写入并在给定的时间延迟后删除它(在这种情况下为5秒)。当我部署以下云功能时,一旦我向ref添加新节点,该函数立即返回(在1秒内),但所有控制台日志都按正确顺序打印。

exports.monitorActiveSignals = functions.database.ref('/names/{pushId}')
    .onCreate((snapshot, context) => {
         const key = snapshot.key;
         console.log(key);
         return wait(5000, snapshot).then((snap) => {
         console.log("timer done")
         snap.ref.remove();
         return;
   })
 })

const wait = (time, snap) => new Promise((resolve) => {
console.log(time)
console.log("timer started");
setTimeout(resolve(snap), time);
});
答案

当你说setInterval(resolve(snap), time)时,你正在做的是在计时器启动之前调用resolve方法。然后,在计时器触发后没有任何反应,因为resolve(snap)什么都不返回 - 没有任何函数可以执行。为什么不尝试这样的事情,以便实际推迟resolve()的执行直到计时器触发:

exports.monitorActiveSignals = functions.database.ref('/names/{pushId}')
.onCreate((snapshot, context) => {
    const key = snapshot.key;
    console.log(key);
    return wait(5000, snapshot).then((snap) => {
        console.log("timer done")
        snapshot.ref.remove();
        return;
    })
})

const wait = (time, snap) => new Promise((resolve) => {
    console.log(time)
    console.log("timer started");
    setTimeout(resolve, time);
});

以上是关于在云函数中返回承诺的主要内容,如果未能解决你的问题,请参考以下文章

返回承诺的函数必须是异步的

异步函数返回承诺,而不是值

异步函数返回承诺,而不是值

对调用承诺返回函数的递归方法进行单元测试

如何让 React Redux 异步操作返回一个承诺?

从异步函数返回的承诺中获取价值