我想在文件上传完成后执行一些代码。我遇到的问题是,我用来上传文件的Promise.all()
方法的承诺是异步返回的。在获取downloadURL
数组中最后一个文件的files
信息后,我尝试运行一些代码,但是执行的时间不一致。
这是我正在尝试的内容:
let lastFileName = files[files.length - 1].name;
Promise.all(
files.map(item => {
const storageRef = firebase
.storage()
.ref()
.child(`test/${item.name}`)
.put(item);
return storageRef.on(
firebase.storage.TaskEvent.STATE_CHANGED,
snapshot => {...},
error => {...},
() => {
storageRef.snapshot.ref
.getDownloadURL()
.then(downloadURL => {
if (lastFileName === item.name) {
someFunc();
}
});
}
);
})
).then(() => alert("firing asynchronously"));
.then(() => alert("firing asynchronously"));
代码在提交文件后立即触发
您所说的storageRef
实际上是UploadTask
instance。并且UploadTask
不返回承诺,因此UploadTask.on(
返回的内容与您期望的有所不同。它返回一个可用于删除侦听器的自定义函数,该函数立即满足UploadTask.on(
约定。
我认为您要做的是返回一个承诺,该承诺将解析为下载URL,您可以使用类似的方法进行:
return storageRef.on(