我想下载一组o文件并使用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()
}
})
})
}
那是结果(不是完全相同的功能,但问题是一样的)
答案 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()
}
})