使用Node中的Q promise库对值数组顺序调用/执行相同的函数;并返回带有结果的新数组/集合

Sequentially call/execute same function on a array of values using Q promise library in Node; and return a new array/collection with the result

本文关键字:数组 返回 集合 结果 新数组 函数 promise 中的 Node 执行 顺序调用      更新时间:2023-09-26

对于下面的代码,如何使用npm Q promise库为arrUrls[]中的每个条目顺序调用downloadFile()函数,以便一次只下载一个文件。

var q = require("q");
var arrUrls = ['http://1.com', 'http://2.com']; //content/length of this array will actually be dynamic.

var downloadFile = function(link)
{
    var deferred = q.defer();
    var requesthandler = function(url, error, response, html)
    {
        //format response and return
        deferred.resolve(response);
    }
    request(urloptions, requesthandler.bind(null, link));
    return deferred.promise;
};

我知道这可以使用npm异步库的async.mapSeries()直接完成。但是,async使用回调方法,如果可能的话,我更喜欢使用promise的解决方案。

对于纯顺序解决方案,您可以使用递归函数构建一个承诺链,该函数添加每个结果。

function wrap(func){
    return function(results) {
        var result = func();
        results.push(result);
        return results;
    };
}
var funcs = [loadFile(x),loadFile(y), loadFile(z)];
var wrapped = funcs.map(wrap);
wrapped
  .reduce(q.when, q([]))
  .then(function(results){
       //results array
});

基本上,它构建了标准的promise链,并使用reduce作为快捷方式将函数调用展开到"结果数组"中。

如果您不需要精确的顺序调用:

您可以通过发出一系列请求/承诺来获得按顺序返回的值。

var requests = [downloadFile('http://blah'), downloadFile('http://blah2')];
q.all(requests).then(function(results) {
    //results will be an array of your results, in order of index
});

请参阅文档中的组合:您可以使用all将一个promise数组转换为对整个promise的promise。