要写入数据库,请将数据发送到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();
}
}
});
我的问题是“为什么函数在写入数据之前为什么要返回它的任务?数据写入后,任务是否应该“完成”?'
答案 0 :(得分:2)
由于<server url>/
操作是异步的(请参阅doc),因此您必须按如下所示返回它们在您的诺言链中返回的诺言,以便“云函数知道何时响应”。客户完成所有工作后”(摘录自{SO}:CRUD data in firestore using firebase function onCall. What happens to any async operation (Promise) within it?)。
set()