Listr:数组映射上的Observable

时间:2017-12-14 15:52:40

标签: javascript node.js rxjs

我想下载一组o文件并使用ListrRxJs报告进度,但是当我运行它时循环并显示不正确的数组索引。

这是任务 [source code]的代码:

{
        title: 'Downloading...',
        task: (ctx) => rx.Observable.create((observer) => {
            const count = ctx.photos.length;
            const urls = ctx.photos.map((photo) => photo.urls.raw)
            urls.forEach(async (url, index) => {
                let data = await download(url);
                if ( index !== count - 1 ) {
                    observer.next(index);               
                } else {
                    observer.complete()
                }
            })
        })
}

那是结果(不是完全相同的功能,但问题是一样的)

result

1 个答案:

答案 0 :(得分:1)

.forEach将同步运行,即使回调它正在使用async / await。说实话,我认为这是一种更好的方法,因为它允许一次发生多次下载,而且您不必依赖于下载的顺序。如果您希望按顺序显示它,您可以维护自己的计数器:

let downloadedCount = 0;
urls.forEach(async (url, index) => {
  let data = await download(url);
  if ( index !== count - 1 ) {
    observer.next(++downloadedCount);               
  } else {
    observer.complete()
  }
})