根据我阅读的文档,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
对象并自己调用resolve
或reject
吗?
这样做很好。您几乎不需要创建新的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,因此对于可调用的云函数来说是可以的。
然而,要回答问题的结尾,您应该注意:
- 如果游戏删除出现错误,CF将停止,游戏和用户都不会被删除
- 如果用户删除出现错误,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()
});