1
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循环吗?

4

3 回答 3

1

jQuery 文档

默认情况下,所有请求都是异步发送的(即默认设置为true)。如果您需要同步请求,请将此选项设置为 false。跨域请求和 dataType: "jsonp" 请求不支持同步操作。请注意,同步请求可能会暂时锁定浏览器,从而在请求处于活动状态时禁用任何操作。从 jQuery 1.8 开始,不推荐在 jqXHR ($.Deferred) 中使用 async: false ;您必须使用成功/错误/完成回调选项而不是 jqXHR 对象的相应方法,例如 jqXHR.done() 或已弃用的 jqXHR.success()。

如上所示,您不能将 jsonp 与同步请求一起使用。所以是的,你的成功回调没有被执行(甚至不确定如果一个函数是同步的而不是仅仅返回值,jQuery 是否会触发一个回调)。

此外,我建议您永远不要发出同步 AJAX 请求,因为网络请求是长时间运行的操作,会破坏用户体验。相反,请接受 @Altinak 的建议并使用 Deferred 对象。

于 2013-10-03T23:25:52.247 回答
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);
});
于 2013-10-03T23:13:22.737 回答
0

将 i 放在 jQueryFunction 调用之后。

不要忘记放置一个“休息”;在 alert(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.
});
于 2013-10-03T23:09:44.200 回答