因此,我试图做的是将多个promise(我正在上传的文件)中的每个downloadURL存储在一个数组中,同时循环遍历它们。发生了什么事,无论我得到多少个项目,我都会获得每个项目的第一个输出,它只会一直为我提供来自第一个承诺的第一个downloadURL。
如果我能以某种方式标记每个诺言,以使它们不会彼此重叠,并且为每个文件给我相同的值,或者myb停止每个诺言,然后等到第一个诺言开始第二个。第一个解决方案对我来说听起来更好,但我仍然不知道该怎么办。
pushUpload(upload: Upload) {
let storageRef = firebase.storage().ref();
this.uploadTask = storageRef.child(`${this.basePath}/${upload.file.name}`).put(upload.file);
this.uploadTask.on(firebase.storage.TaskEvent.STATE_CHANGED,
(snapshot) => {
// upload in progress
upload.progress = Math.ceil((snapshot.bytesTransferred / snapshot.totalBytes) * 100)
},
(error) => {
// upload failed
console.log(error)
},
() => {
// upload success
this.uploadTask.snapshot.ref.getDownloadURL().then((url)=>{
this.uploadInfo.push(url)
})
})
};
uploadMultiple() {
let files = this.selectedFiles
let filesIndex = _.range(files.length)
_.each(filesIndex, (idx)=>{
this.currentUpload = new Upload(files[idx]);
this.service.pushUpload(this.currentUpload);
})
}
您可以使用RxJS将您的Promises变成Observable,并使用forkJoin
等待它们中的每一个完成。
forkJoin
您还可以使用import { from, forkJoin } from 'rxjs';
let promises = thePromiseArray();
forkJoin(...promises.map(promise => from(promise))).subscribe(
results => {
console.log("This is an array of the results of each Promise:", results);
}
)
向所有下载或每个下载单独添加额外的运算符。例如,您可以使用pipe
来确定等待的时间不要长一些:
timeout