javascript - 列表 : Observable on array map

标签 javascript node.js rxjs

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

这是任务的代码 [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

最佳答案

.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()
  }
})

关于javascript - 列表 : Observable on array map,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47817378/

相关文章:

node.js - 如何在 Promise 中设置 body?

javascript - 模块导出类和函数

javascript - 瘦身弹出代码

javascript - Vue.JS 数据属性未定义

javascript - 等到处理完成后再导出 Node.js 模块?

Angular:Observable 在使用管道和选项卡时改变行为

http - 如何使用 observable .map 和 .subscribe 处理我的数据

Angular 4嵌套http调用和合并数据

javascript - 如何防止 Meteor 将集合中的所有文档发送给客户?

javascript - 获取子iframe中父页面的隐藏变量数据