从Firebase的onCall函数返回承诺的正确方法?



根据我阅读的文档,onCall函数应该返回promise。类似这样的东西:

...onCall((data, context) => {
return db.collection('game').doc(game_id).delete();
});
...

这只需获取与delete函数相关联的promise并将其返回给调用者。

然而,如果我想在删除后采取额外的步骤,那么有多个返回路径,我不清楚该返回什么:

...onCall((data, context) => {
return db.collection('game').doc(game_id).delete()
.then(){
return db.collection('user').doc(user_id).delete()
}
//.catch(){ return ??? }
});
...

我看到了与上面键入的代码类似的代码,但我不清楚这是否正确。首先,是否说通过返回游戏删除承诺,如果出现错误,将返回给用户,如果成功,则将用户删除承诺返回给用户?如果出现用户删除异常怎么办?

我必须创建自己的Promise对象并自己调用resolvereject吗?

这样做很好。您几乎不需要创建新的Promise。这适用于调用不返回promise的函数,而是提供回调的情况。

在学习如何处理承诺方面有很多资源。代码是否在云函数中运行并不重要——JavaScript承诺在任何上下文中都能起到同样的作用。一个可调用函数只需要承诺知道工作何时完成,以及返回给调用者的内容。

...onCall((data, context) => {
return db.collection('game').doc(game_id).delete()
.then(){
return db.collection('user').doc(user_id).delete()
}
//.catch(){ return ??? } });

我看到了与上面键入的代码类似的代码,但不清楚我相信这是正确的。首先,它是说通过返回游戏删除承诺,如果出现错误,将返回用户,如果成功,则用户删除承诺将是否返回给用户?如果出现用户删除异常怎么办?

您在这段代码中拥有的是使用then()方法的Promise链接。由于对promise.then()的调用返回Promise,所以第一个return确实返回了Promise,因此对于可调用的云函数来说是可以的。

然而,要回答问题的结尾,您应该注意:

  1. 如果游戏删除出现错误,CF将停止,游戏和用户都不会被删除
  2. 如果用户删除出现错误,CF将停止,游戏将被删除(在错误之前成功删除(,但用户不会被删除

如果您想确保在一个原子操作中删除两者(两者都被删除或没有被删除(,您应该使用如下的批处理写入:

...onCall((data, context) => {

let batch = db.batch();
const gRef = db.collection('game').doc(game_id);
batch.delete(gRef);
const uRef = db.collection('user').doc(user_id);
batch.delete(uRef);
return batch.commit()
});

相关内容

  • 没有找到相关文章