Javascript while循环回调

时间:2013-10-03 22:41:56

标签: javascript

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

3 个答案:

答案 0 :(得分:1)

来自jQuery documentation

默认情况下,所有请求都是异步发送的(默认情况下设置为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);
});