我正在使用Firebase存储桶保存文件并将其下载链接保存到数据库。
除了在执行foreach循环(_lodash)之后文件索引混合在一起之外,所有其他都应该工作正常。
getFiles(e){
this.outPutFiles = e;
_.each(this.outPutFiles, ((file) => {
const ref = this._storage.ref(file);
return ref.getDownloadURL().subscribe(url => this.img_array.push(url));
}));
}
预期的行为应为:
this.outPutFiles = [
0:"o-t-status-files/.....Qd5bGm"
1:"o-t-status-files/.....dz2bd8"
]
还有
this.img_array = [
0:"https://firebase....%2FJ6Qx9........Qd5bGm"
1:"https://firebase....%2FJ6Qx9........dz2bd8"
]
不幸的是,有时this.img_array中的文件索引与this.outPutFiles变量上的索引文件不匹配。
例如,this.img_array可能会变成这样...
this.img_array = [
0:"https://firebase....%2FJ6Qx9........dz2bd8"
1:"https://firebase....%2FJ6Qx9........Qd5bGm"
]
索引0的文件移至索引1,索引1的文件移至索引0。
如何防止这种情况,以确保文件索引在this.outPutFiles
和this.img_array
数组中都匹配?
答案 0 :(得分:0)
由于ref.getDownloadURL()
是异步的,因此outPutFiles[1].getDownloadURL()
可能在outPutFiles[0].getDownloadURL()
之前完成。
尝试类似的方法(或使用rxjs运算符):
Promise.all(_.map(this.outPutFiles, file => this._storage.ref(file).getDownloadURL()))
.then(img_array => console.log(img_array))