如何使用lodash或下划线同步迭代数组
我有一个数组,其中包含每个索引的文件名。 我想一次一个 (同步)下载这些文件。 我知道' Async
'模块。 但是我想知道在Lodash
或Lodash
或Bluebird
库中的任何函数是否支持这个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,但也许你可以重新考虑的可读性和优雅。