如何修复此foreach循环以匹配索引

时间:2018-08-23 16:42:07

标签: javascript lodash

我正在使用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.outPutFilesthis.img_array数组中都匹配?

1 个答案:

答案 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))