Firestore功能 - 在返回结果之前使用云脚本更新新创建的数据

时间:2018-03-15 07:03:10

标签: android firebase kotlin google-cloud-firestore

我想在本地创建一个文档,将其上传到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;
            })
});

1 个答案:

答案 0 :(得分:0)

而不是使用addOnCompleteListener尝试addSnapshotListener。更新数据后,您的应用应自动获取更新。