使用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
对于下面的代码,如何使用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。
相关文章:
- 对象数组返回自最近日期以来的最高总体值
- 从多维数组返回嵌套数组
- 为什么当我点击<a>使用纯javascript;这个“;返回url,数组返回“url”;未定义”;
- 带多维数组返回字符串的json_encode;阵列”;而不是数据
- 如何将 AJAX 响应作为 JavaScript 数组返回
- 我正在尝试在 JS 中制作这个随机名称生成器.数组返回未定义
- .push() 多个对象进入 JavaScript 数组返回 'undefined'
- 如何按属性从可观察数组返回项
- 通过jquery发送的关联php数组返回[对象对象]
- 从 Javascript 中的对象数组返回单个属性的数组
- 循环遍历对象数组返回“未定义”
- 拼接数组返回空的序列
- Javascript 多维数组返回第一个值,然后失败
- Json 数组返回空值
- 从下划线.js中的数组返回一系列值
- for 语句不从数组返回值
- MongoDB从数组返回特定字段
- 试图将数组返回到表中的列表中
- Javascript中的二维数组返回未定义的数组
- 将函数数组作为布尔值数组返回