我正在尝试从Firebase存储桶下载文件并将其存储到数据库。我希望下载功能异步工作,以便在文件array (this.outPutFiles)
中的下一个文件下载并推送到array (this.img_array)
之前,文件下载完成并推送到array。我尝试了此操作,但未如预期的那样
async getFiles(e){
this.outPutFiles = e;
await Promise.all(_.map(this.outPutFiles, file =>
this._storage.ref(file).getDownloadURL().subscribe(url => this.img_array.push(url))
));
}
答案 0 :(得分:0)
存储要在数组中获取的这些下载URL。
类似这样的东西:
downloadUrls = [];
imageUrls = [];
在getFiles
函数内部,将getDownloadURL()
推入downloadUrls
数组中。像这样:
getFiles(e){
this.outPutFiles = e;
Promise.all(_.map(this.outPutFiles, file =>
this.downloadUrls.push(this._storage.ref(file).getDownloadURL());
));
}
现在在downloadUrls
数组上应用forkJoin。像这样:
forkJoin(this.downloadUrls).subscribe(latestValues => this.imageUrls = _.sortBy(latestValues));
如果您使用的是最新版本的Rxjs,则需要像这样导入 forkJoin
:
import { forkJoin } from 'rxjs/observable/forkJoin';
答案 1 :(得分:0)
这是我通常用于实现顺序异步请求的方法,也许这会有所帮助。将异步函数推送到一个数组,然后异步遍历该数组。
const fn1 = () => {
return new Promise((resolve) => {
setTimeout(() => {
resolve('fn1')
}, 3000)
})
}
const fn2 = () => {
return new Promise((resolve) => {
setTimeout(() => {
resolve('fn2')
}, 2000)
})
}
const fn3 = () => {
return new Promise((resolve) => {
setTimeout(() => {
resolve('fn3')
}, 1000)
})
}
const results = []
let myArr = [fn1, fn2, fn3]
const asyncGet = async (fns)=> {
for (const fn of fns) {
await fn()
.then(result=>results.push(result))
}
}
asyncGet(myArr)
.then(() => console.log(results))
.catch(err=>console.log(err))