将数据写入数据库之前,将返回Firebase任务

时间:2018-08-13 10:17:20

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

要写入数据库,请将数据发送到firebase函数。写入数据时(我认为这是任务完成时的时间……),下一个活动应该加载并能够下载写入的数据。也许有更有效的方法可以做到这一点,但这还不重要。

我的firebase函数如下所示,并且执行了应做的工作,除了我认为应该将任务返回到早期。

注意:只有第一个“设置函数”才需要在返回任务之前写入数据库。

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();
                        }
                    }
                });

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

1 个答案:

答案 0 :(得分:2)

由于<server url>/操作是异步的(请参阅doc),因此您必须按如下所示返回它们在您的诺言链中返回的诺言,以便“云函数知道何时响应”。客户完成所有工作后”(摘录自{SO}:CRUD data in firestore using firebase function onCall. What happens to any async operation (Promise) within it?)。

set()