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
循环吗?
来自 jQuery 文档:
默认情况下,所有请求都是异步发送的(即默认情况下设置为 true(。如果需要同步请求,请将此选项设置为 false。跨域请求和数据类型:"jsonp"请求不支持同步操作。请注意,同步请求可能会暂时锁定浏览器,在请求处于活动状态时禁用任何操作。从jQuery 1.8开始,使用async:false与jqXHR($。延迟(已弃用;您必须使用 success/error/complete 回调选项,而不是 jqXHR 对象的相应方法,例如 jqXHR.done(( 或已弃用的 jqXHR.success((。
如上所示,不能将 jsonp 与同步请求一起使用。所以是的,你的成功回调没有得到执行(甚至不确定如果函数是同步的而不是仅仅返回值,jQuery 是否会触发回调(。
此外,我建议您永远不要发出同步 AJAX 请求,因为网络请求是长时间运行的操作,可能会破坏用户体验。相反,请采纳@Altinak的建议并使用延迟对象。
整个问题的更好解决方案是使用延迟对象。
我现在将忽略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 查询(受每个主机客户端连接限制的约束(,一旦全部完成,将使用 arguments
数组中的每个结果(按提交顺序(调用callback
。
注意:这与原始语义不完全相同,原始语义callback
传递了一个参数,即结果数组。 如果要保留它,请使用:
.done(function() {
var args = [].slice.call(arguments, 0);
callback.call(this, args);
});
将 i 放在 jQueryFunction 调用之后。
不要忘记在 alert(i( 之后放置一个"break;"以退出 while 循环。
如果在 jQueryFunction 调用中的 i 必须在回调中,请使用 done 将代码放在 ajax 之后执行,并且不要使用 i。 在 ajax 调用中将异步更改为 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.
});