我想在本地创建一个文档,将其上传到Firestore,让服务器代码运行并从中获取结果。我怎么能这样做?
我的示例工作正常,但我的startNewGame
函数的结果不等待服务器脚本完成并返回旧数据(服务器脚本尚未更新文档)。刷新数据后,我的应用程序将检索正确的数据(由服务器脚本修改)。
有人知道如何解决这个问题吗?
我的startNewGame
功能还会上传游戏,这意味着,最终结果应该是来自服务器的修改版本,不应该吗?
代码
fun startNewGame(): Single<GameModel> {
var model = GameModel(UserManager.user!!.uid, null)
// 1) create game
var res: Single<DocumentReference> = Single.create({ emitter ->
MainApp.db.collection(Constants.FIREBASE_GAME).add(model)
.addOnCompleteListener({ task ->
if (!emitter.isDisposed) {
if (task.isSuccessful()) {
emitter.onSuccess(task.result)
} else {
emitter.onError(Throwable(task.getException()))
}
}
})
})
// 2) upload game
res = res.flatMap { game -> uploadGame(game) }
return res
}
private fun uploadGame(game: GameModel): Single<GameModel> {
return Single.create<GameModel>({ emitter ->
game.doc!!.set(game).addOnCompleteListener({ task ->
if (!emitter.isDisposed) {
if (task.isSuccessful()) {
emitter.onSuccess(game)
} else {
emitter.onError(Throwable(task.getException()))
}
}
})
})
}
简单的测试服务器脚本:
exports.findGame = functions.firestore
.document('/games/{gameId}')
.onCreate(event => {
const newData = event.data.data();
var user1 = newData.player1
console.log('New game created by user ' + newData.player1 + '!');
// returning the promise should have the result, that we wait for the function
return event.data.ref.set({
player2: 'SOME PLAYER 2'
}, {merge: true}).then(res => {
console.log('Player 2 set');
return res;
})
});
答案 0 :(得分:0)
而不是使用addOnCompleteListener
尝试addSnapshotListener
。更新数据后,您的应用应自动获取更新。