How to iterate an array synchronously using lodash

2020-06-13 04:02发布

I have an array that contains filenames at each index. I want to download those files one at a time (synchronously). I know about 'Async' module. But I want to know whether any functions in Lodash or Underscore or Bluebird library supports this functionality.

2条回答
放我归山
2楼-- · 2020-06-13 04:35

using Bluebird, there is a situation similar to yours with an answer here: How to chain a variable number of promises in Q, in order?

This seems like a decent solution but in my opinion much less readable and elegant as async.eachSeries(I know you said you don`t want the 'async' solution but maybe you can reconsider.

查看更多
迷人小祖宗
3楼-- · 2020-06-13 04:42

You can use bluebird's Promise.mapSeries:

var files = [
    'file1',
    'file2'
];

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

Depending on what you use to download file, you may have to build a promise or not.

Update 1

An exemple of a downloadFile() function using only nodejs:

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);
            });
        });
    });
}

Update 2

As Gorgi Kosev suggested, building a chain of promises using a loop works too:

var p = Promise.resolve();
files.forEach(function(file) {
    p = p.then(downloadFile.bind(null, file));
});

p.then(_ => console.log('done'));

A chain of promise will get you only the result of the last promise in the chain while mapSeries() gives you an array with the result of each promise.

查看更多
登录 后发表回答