function jQueryFunction(url,callback)
{
$.ajax
({
type: "GET",
async: false,
url: url,
dataType: "jsonp",
jsonp: "callback",
jsonpCallback: "tpsHandler",
success: function(json)
{
return callback(json);
}
});
}
function tmpFunction(callback)
{
var jsonArray = new Array();
var i = 0;
while(true)
{
for(var j = 0; j < url_array.length; j++)
{
jQueryFunction(url_array[j], function(json){
jsonArray[j] = json;
i++;
});
}
if(i >= url_array.length)
{
return callback(jsonArray);
}
else
{
alert(i);
}
}
}
当我拨打tmpFunction时,网站会向我显示“0”。为什么i
总是0? tmpFunction是否永远不会运行for
循环?
答案 0 :(得分:1)
默认情况下,所有请求都是异步发送的(默认情况下设置为true)。如果需要同步请求,请将此选项设置为false。跨域请求和dataType:“jsonp”请求不支持同步操作。请注意,同步请求可能会暂时锁定浏览器,并在请求处于活动状态时禁用任何操作。从jQuery 1.8开始,不推荐使用async:false和jqXHR($ .Deferred);您必须使用success / error / complete回调选项而不是jqXHR对象的相应方法,例如jqXHR.done()或不推荐使用的jqXHR.success()。
如上所示,您不能将jsonp用于同步请求。所以是的,你的成功回调没有被执行(甚至不确定如果一个函数是同步的,jQuery是否会触发回调而不是只返回值)。
此外,我建议您从不制作同步AJAX请求,因为网络请求是长时间运行的操作,可能会破坏用户体验。相反,请参考@Altinak的建议并使用延迟对象。
答案 1 :(得分:0)
在jQueryFunction调用之后放置i。
不要忘记“休息”;警告后(i)离开while循环。
如果i必须在jQueryFunction中的回调内部调用,请使用done将代码放在ajax之后执行,并且不要使用i。在ajax调用中将async更改为true以完成工作。
$.ajax( //your settings
).done(function(data){
//check the value in data instead of i.
//due to .ajax being asynchronous code that needs to wait needs
//to be in .done or the success callback.
});
答案 2 :(得分:0)
解决整个问题的更好方法是使用延迟对象。
我现在要忽略while (true)
位,因为这没有意义:
function jQueryFunction(url)
{
return $.ajax({
type: "GET",
async: true, // NB: **not** false
url: url,
dataType: "jsonp",
jsonp: "callback",
jsonpCallback: "tpsHandler" // any good reason why you're defining this?
});
}
function tmpFunction(callback)
{
var def = [];
for (var i = 0; i < url_array.length; ++i) {
def.push(jQueryFunction(url_array[i]));
}
return $.when.apply($, def).done(callback);
}
这将并行运行所有AJAX查询(取决于每个主机客户端连接限制),一旦完成,将使用每个结果(按提交顺序)调用callback
arguments
数组。
注意:这与原始语义不完全相同,原始语义callback
传递了一个结果数组的参数。如果你想保留它,请使用:
.done(function() {
var args = [].slice.call(arguments, 0);
callback.call(this, args);
});