Javascript/JQuery中的异步映射/减少
Asynchronous map/reduce in Javascript/JQuery
在Javascript(jQuery)中执行以下操作的惯用方法是什么?
- 生成一组异步作业
- 收集部分结果
- 每个作业完成后,合并部分结果
以上可以通过以下方式实现(为了简单起见,假设按顺序处理请求;在更现实的情况下,计数器可以完成这项工作):
var results = new Array();
$.each(objs, function(i,obj)){
$.getJSON(make_async_request(obj), function(data) {
results[data.key] = data.value;
if (i == objs.length-1)
elaborate(results);
}
});
这在我看来很难看。有什么建议吗?
您可以这样使用jQuery.Deferred
:
$.when($.get('/a/'), $.get('/b/')).then(function() {
// all gets are ready
});
如果需要将所有结果合并到一个对象中,可以循环then
回调中的参数:
$.when($.get('/a/'), $.get('/b/')).then(function() {
var results = {},
args = Array.prototype.slice.call(arguments),
data;
$.each( args, function(i, resp) {
data = resp[0]; // resp is the results array
results[data.key] = data.value;
});
console.log(results);
});
var results = [], ajaxes = [];
$.each(objs, function(i,obj)){
var xhr = $.ajax({
url: make_async_request(obj),
dataType: 'json'
}).done(function() {
results[data.key] = data.value;
if (i == objs.length-1) elaborate(results);
});
ajaxes.push(xhr);
});
$.when.apply(null, ajaxes).done(function() {
alert('all ajaxes are done');
});
由于$.getJSON
是异步的,并且在发出请求后立即返回,因此在发出最后一个请求后,您的检查结果将为true。
通过利用$.ajax
和$.getJSON
返回Deferred这一事实,您可以有效地执行您想要的操作。使用$.when
和$.map
收集所有请求的数据进行处理。看看jQuery中的延迟/承诺api,它们非常强大,允许以下一行代码工作:
$.when($(objs).each(function (i, obj) { return $.getJSON(make_async_request(obj)); }), elaborate);
完全公开:公然插入我自己的库,队列流:)
q(objs)
.map(q.async(function(obj, callback) {
$.getJSON(make_async_request(obj), callback);
}))
.reduce(function(results, data) {
results[data.key] = data.val;
return results;
}, elaborate, {});
队列流使用队列的概念使异步功能代码看起来几乎完全同步。:)它还可以让你用源代码组织做一些非常有趣的事情,看看GitHub上readme中的.branch
方法。(刚刚更新了我的示例,以匹配问题示例中的更改。)
也可以写成:
q(objs)
.map(make_async_request)
.map(q.async($.getJSON))
.reduce(function(results, data) {
results[data.key] = data.val;
return results;
}, elaborate, {});
这真的很酷,但对于不熟悉的人来说可能需要一点时间才能摸索。:)
截至2018年的更新:现在你可以使用了
results = await Promise.all(objs.map(someAsyncFunction));
其中CCD_ 9应该是某个列表,而CCD_。有关更多详细信息,请参阅此问题的答案:在map中调用异步函数的最佳方式?
相关文章:
- 如何在映射数组中添加换行符
- ng映射方向备选方案
- 无法通过数组映射绑定
- ReactJS映射:如何仅在url变量不为空时呈现html链接
- 使用Scala Play Framework视图中的键检索映射值
- 淘汰映射;不起作用
- 改进 jQuery 以减少重复
- 映射数组ES6时考虑空值
- 如何减少图像映射的此 jquery 切换代码
- Javascript/JQuery中的异步映射/减少
- 正确过滤/映射/减少
- 映射减少查询以计数标记
- 使用JavaScript映射和减少JSON对象
- 如何在 JavaScript 中映射/减少/过滤 Set
- mongoDB中的文档怎么可能被映射但没有减少呢
- 我怎样才能得到一个按"减少"的降序排序的映射/减少结果;值";价值如果也使用列表功能可以实
- Mongo映射.减少错误
- 返回值作为映射上的键减少
- 减少坐标对集合的映射
- 推荐Riak mapreduce Javascript虚拟机池大小的地图和减少阶段?(映射超时错误)