使用$.when()和.then基于$.getJSON响应更新数组
Using $.when() and .then to update an array based on $.getJSON responses
我正在尝试使用来自多个getJSON请求的响应来更新数组值。我已经尝试了很多种方法,下面的片段是我使用过的最简单的形式。在.then()触发时,单个成功回调尚未更新数组,因此警报显示原始值。我还尝试将各个jqXHR对象存储在一个数组中并处理它们,但它们都是readyState:1。关于如何在回复全部完成后获得参考,有什么建议吗?
$(function() {
var points = [['A', 12946],
['B', 4223],
['C', 2774],
];
function makePointCalls(i) {
return $.getJSON("http://otter.topsy.com/searchcount.json?callback=?",
{
q: points[i][0]
},
function(data) {
points[i][1] = data.response.d;
}
);
}
$.when($.each(points, function(i, value){
makePointCalls(i);
})
).then(function(){
//alert me after all the getJSONs are done and array updated?
alert(points);
});
});//doc ready
您的代码需要对makePointCalls
的返回值做出反应,该值在each
循环中被丢弃。
未测试的代码片段如下(根据kas673的评论工作):
// Collect deferreds first
var deferreds = jQuery.map(points, function(i, value){
return makePointCalls(i);
});
// Pass all deferreds to when
jQuery.when.apply(jQuery, deferreds).then(…);
请注意,使用map
而不是each
来创建具有makePointCalls
的返回值(延迟)的数组。用于调用when
的对apply
的调用是为了确保when
以文档格式接收其参数。如果将一个数组作为唯一参数传递给when
,则可以假设它收到了一个已解析的延迟,并立即执行then
中的函数。
关于应用程序的使用,一个更详细的解释是when
假设所有内容都是已解析的延迟,而不是延迟。首先需要注意的是,递延是某种回调管理器。它保留成功/解析时调用的回调,以及失败/拒绝时调用的回叫。Deferred用于提供一个返回值,只有在以后才能知道函数调用是否成功。一个例子是您的AJAX请求,它需要等待服务器,但不应该阻止JavaScript的执行。
您对$.getJSON
的每个调用都返回一个deferred,可用于对请求完成做出反应。$.when
将任意数量的延迟作为其参数,并在已知延迟的聚合状态时(当when
的所有参数都已解析或至少一个被拒绝时)立即调用then
的参数。
当deferreds
作为Deferred
对象的数组时,调用$.when(deferreds).then(callback)
会导致立即调用callback
,如前所述。当聚合状态已知时,调用$.when(deferred[0], deferred[1]).then(callback)
确实调用callback
。使用apply
可以解压缩数组,并将数组中的每个元素用作调用apply
的函数的参数(在您的情况下是when
)。
再次检查您的ActiveX通知,因为Firebug在Firefox中运行,幸运的是ActiveX不受支持。任何与ActiveX相关的东西都可能是因为您使用的是Microsoft-only API,而您不应该这样做。
用$.map(...).get()
替换$.each(...)
,用return makePointCalls(i)
替换makePointCalls(i)
$(function() {
var points = [['A', 12946],
['B', 4223],
['C', 2774],
];
function makePointCalls(i) {
return $.getJSON("http://otter.topsy.com/searchcount.json?callback=?",
{
q: points[i][0]
},
function(data) {
points[i][1] = data.response.d;
}
);
}
$.when($.map(points, function(i, value){
return makePointCalls(i);
}).get();
).then(function(){
//alert me after all the getJSONs are done and array updated?
alert(points);
});
});//doc ready
- 如何将getJson的响应保存在全局变量中
- Ember.js:将Em.$.getJSON转换为promise并将响应绑定到控制器上下文的正确方法
- 使用getJSON填充动画响应图像网格
- 存储 $.getJSON() 响应到本地变量
- $.getJson() 响应限制
- 用于 json 和 jsonp 的 $.ajax 和 $.getJSON 无法正确获取来自第三方服务器的响应
- 如何格式化来自getJSON()jQuery调用的HTTP请求的HTTP响应
- $.getJSON在函数内部时没有响应
- 如何将两个getjson响应合并为一个变量,然后处理该变量
- 使用$.when()和.then基于$.getJSON响应更新数组
- 从函数返回getJSON响应
- 使用$. getjson()函数的空响应
- 如何防止jQuery's $.getJSON从转换我的ajax响应键从字符串到整数
- getJSON只响应明文,否则不起作用
- getJSON响应的问题
- jQuery $. getjson()方法失败时,响应是text/html
- $.getJSON - 在 url 中使用参数时无法捕获响应
- jQuery getJSON方法没有响应
- jQuery getJSON请求返回空响应-相同的域
- 如何在第一个 getjson 函数中的另一个 getjson 调用中使用 getjson 响应变量