异步任务跟不上 for 循环(firebase)

Posted

技术标签:

【中文标题】异步任务跟不上 for 循环(firebase)【英文标题】:Async task could not keep up with for loop (firebase) 【发布时间】:2020-03-13 15:16:34 【问题描述】:
  for (Uri mUri : mSelected) 
   
       imagesRef = storageRef.child(postid + mUri.getLastPathSegment());
       imagesRef.putFile(mUri).addOnSuccessListener(task4 ->
       db.collection("posts").document(postid).update("photo_id", FieldValue.arrayUnion(imagesRef.getDownloadUrl())));
   

所以,现在我正在使用 firestore 和 firebase 存储。我将(多个)图像上传到存储中,当它上传时,我得到下载 url 并想将它添加到我的 firestore 中。所以,问题是,只有最后一个图像被添加到 firestore,所有图像都被添加到存储中,但只有最后一个 imgUrl 被添加到 firestore。由于 firebase 使用异步任务,我怀疑这是因为更新任务跟不上循环。非常感谢任何帮助!!!

【问题讨论】:

只是检查一下,是不是同时上传2张图片会出现问题? 每次迭代时postid 的值是多少? @nada 是的,当我只发布 1 张图片时,图片会成功上传,但是当我上传 2 张或更多时,只有最后一张图片会上传到 Firestore @AlexMamo postid 每次创建都不一样,此代码在我创建新帖子时使用,因此当用户单击“发布”时,我想将图片上传到存储并获取他们的 url,不幸的是我只能将最后一个 url 上传到 firestore 【参考方案1】:

我认为问题可能出在 imagesRef,它在 for (Uri mUri : mSelected) ... 之外声明,因此在 addOnSuccessListener(...) 响应之前被替换。

所以,在本地向for (Uri mUri : mSelected) ... 声明它,看看它是否不能解决问题。像这样

for (Uri mUri : mSelected) 

       var imagesRef = storageRef.child(postid + mUri.getLastPathSegment());
       imagesRef.putFile(mUri).addOnSuccessListener(task4 ->
       db.collection("posts").document(postid).update("photo_id", FieldValue.arrayUnion(imagesRef.getDownloadUrl())));
 

【讨论】:

我试过了,但它只是抛出 java.lang.reflect.InvocationTargetException 错误。你可能知道这意味着什么 @aishaaishapeng 您是否更改了代码中的其他任何内容?当您删除 var 时,它仍然显示错误吗?它究竟指向哪条线? 谢谢伙计!它有效,错误是针对其他 smtg 的。要获取下载 url,我会在成功侦听器上获取它。你帮了大忙!

以上是关于异步任务跟不上 for 循环(firebase)的主要内容,如果未能解决你的问题,请参考以下文章

为啥这个完成处理程序会跳过一个 for 循环

解决for循环中异步请求顺序不一致的问题

等到带有异步网络请求的 swift for 循环完成执行

Shell脚本-循环语句

全局未在异步 for 循环中正确修改

js中for循环里面有异步请求怎么解决