如何使用lodash或下划线同步迭代数组

我有一个数组,其中包含每个索引的文件名。 我想一次一个 (同步)下载这些文件。 我知道' Async '模块。 但是我想知道在LodashLodashBluebird库中的任何函数是否支持这个function。

你可以使用蓝鸟的Promise.mapSeries

 var files = [ 'file1', 'file2' ]; var result = Promise.mapSeries(files, function(file) { return downloadFile(file); // << the return must be a promise }); 

根据你用什么来下载文件,你可能不得不build立一个承诺或不。

更新1

仅使用nodejs的downloadFile()函数的例子:

 var http = require('http'); var path = require('path'); var fs = require('fs'); function downloadFile(file) { console.time('downloaded in'); var name = path.basename(file); return new Promise(function (resolve, reject) { http.get(file, function (res) { res.on('data', function (chunk) { fs.appendFileSync(name, chunk); }); res.on('end', function () { console.timeEnd('downloaded in'); resolve(name); }); }); }); } 

更新2

正如Gorgi Kosev所build议的那样,使用循环来build立一系列的承诺也是可行的:

 var p = Promise.resolve(); files.forEach(function(file) { p = p.then(downloadFile.bind(null, file)); }); p.then(_ => console.log('done')); 

一个承诺链只会得到链中最后一个承诺的结果,而mapSeries()每个承诺的结果提供一个数组。

使用蓝鸟,有一种类似于你的情况,在这里有一个答案: 如何链接在Q中的可变数量的承诺,为了?

这似乎是一个体面的解决scheme,但在我看来,作为async.eachSeries(我知道你说你不希望“asynchronous”的解决scheme,但也许你可以重新考虑的可读性和优雅。