【问题标题】:Firebase task is returned before data is written to database在数据写入数据库之前返回 Firebase 任务
【发布时间】:2019-01-20 01:07:59
【问题描述】:

为了写入我的数据库,我将我的数据发送到一个 firebase 函数。当数据被写入时(在我看来,这将是任务完成的时候......)下一个活动应该加载并能够下载写入的数据。也许有更有效的方法可以做到这一点,但这不是重点。

我的firebase函数如下,它应该做的,除了我想早点返回任务。

注意:只有第一个“set function”需要在任务返回前写入数据库。

exports.createPostHandler = (data, context) => {
//Post
admin.database().ref('/posts/' + data.team + '/' + data.UID).set({
    UID : data.UID,
    sender : data.username,
    user : context.auth.uid,
    title : data.title,
    time : data.time,
    imagelink : data.imagelink,
    text : data.text
}).then(() => {
    console.log('User ' + context.auth.uid + ' created post ' + data.UID);

    //Postcompressed
    admin.database().ref('/team/' + data.team + '/posts/' + data.UID).set({
    UID : data.UID,
    sender : data.username,
    user : context.auth.uid,
    title : data.title,
    time : data.time
    }).then(() => {
        console.log('Created compressedpost ' + data.UID + ' in team ' + data.team);
    });
});

在客户端,代码如下,除了在数据写入数据库之前加载加载下一页之外,它会做它应该做的事情。如果我在写入数据几秒钟后访问“PostPage”活动,它就会起作用,所以我确信这是问题所在。

FirebaseFunctions.getInstance().getHttpsCallable("createPost").call(createDatamap(UID, title, posttext, username, time, ""))
                        .addOnCompleteListener(new OnCompleteListener<HttpsCallableResult>() {
                    @Override
                    public void onComplete(@NonNull Task<HttpsCallableResult> task) {
                        if(task.isSuccessful()) {
                            PostCompressed postCompressed = new PostCompressed(UID, title, username, time, null, null);
                            postDialog.dismiss();
                            Toast.makeText(context, "Du har skapat ett inlägg", Toast.LENGTH_SHORT).show();
                            startPostPage(postCompressed);
                        } else {
                            v.setClickable(true);
                            alertView.findViewById(R.id.loadview).setVisibility(View.GONE);
                            Toast.makeText(context, "Du kunde inte skapa ett inlägg... Något gick snett!", Toast.LENGTH_SHORT).show();
                        }
                    }
                });

我的问题是'为什么函数在数据写入之前返回它的任务?写入数据时,任务不应该“完成”吗?'

【问题讨论】:

    标签: android node.js firebase firebase-realtime-database google-cloud-functions


    【解决方案1】:

    由于set() 操作是异步的(请参阅doc),您必须返回它们在您的承诺链中返回的承诺,如下所示,以便“云函数知道何时响应客户端,之后所有工作都已完成”(摘自此 SO 答案:CRUD data in firestore using firebase function onCall. What happens to any async operation (Promise) within it?)。

    exports.createPostHandler = (data, context) => {
    //Post
    return admin.database().ref('/posts/' + data.team + '/' + data.UID).set({
        UID : data.UID,
        sender : data.username,
        user : context.auth.uid,
        title : data.title,
        time : data.time,
        imagelink : data.imagelink,
        text : data.text
    }).then(() => {
        console.log('User ' + context.auth.uid + ' created post ' + data.UID);
    
        //Postcompressed
        return admin.database().ref('/team/' + data.team + '/posts/' + data.UID).set({
        UID : data.UID,
        sender : data.username,
        user : context.auth.uid,
        title : data.title,
        time : data.time
     }).then(() => {
            console.log('Created compressedpost ' + data.UID + ' in team ' + data.team);
            return true;
     });
    });
    

    【讨论】:

    • 完美运行!谢谢你。我想我现在知道 Promise 是如何工作的更好了...... ;)
    • @Z.Klockar 很高兴我能帮助你!你可以接受我的回答,见stackoverflow.com/help/someone-answers。谢谢!
    猜你喜欢
    • 2017-03-27
    • 2018-08-06
    • 1970-01-01
    • 2015-09-21
    • 2022-01-18
    • 2017-10-28
    • 1970-01-01
    • 2019-03-30
    • 1970-01-01
    相关资源
    最近更新 更多