如何编写异步函数

时间:2018-08-23 18:30:47

标签: javascript angular async-await

我正在尝试从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))
  ));

}

2 个答案:

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