尝试从 Cloud Storage 获取 downloadURL 时出现多项承诺问题
Problem with multiple promises when trying to get downloadURL's from Cloud Storage
所以我想做的是将来自多个承诺(正在上传的文件)的每个下载 URL 存储在一个数组中,同时循环遍历它们。
发生的事情是,无论我得到多少项目,我都会得到每个项目的第一个输出,它只是不断给我第一个承诺的第一个 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 变成 Observables,然后使用 forkJoin
等待每个 Promise 完成。
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
来确保您等待的时间不会超过某个时间:
forkJoin(...promises.map(promise => from(promise).pipe(
timeout(25000) // This is applied to each download individually
))).pipe(
// Any operators added here would be applied to the forkJoin, so all downloads as a whole
).subscribe(
results => {
console.log("This is an array of the results of each Promise:", results);
}
)
所以我想做的是将来自多个承诺(正在上传的文件)的每个下载 URL 存储在一个数组中,同时循环遍历它们。 发生的事情是,无论我得到多少项目,我都会得到每个项目的第一个输出,它只是不断给我第一个承诺的第一个 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 变成 Observables,然后使用 forkJoin
等待每个 Promise 完成。
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
来确保您等待的时间不会超过某个时间:
forkJoin(...promises.map(promise => from(promise).pipe(
timeout(25000) // This is applied to each download individually
))).pipe(
// Any operators added here would be applied to the forkJoin, so all downloads as a whole
).subscribe(
results => {
console.log("This is an array of the results of each Promise:", results);
}
)