Javascript while 循环回调


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.
});

最新更新