JavaScript变量引用问题

时间:2011-07-30 13:15:28

标签: javascript jquery reference

我正在尝试发送请求然后在回调函数中,更改参数然后再次发送请求。像这样:

function sendRequest() {
    params = {param1:'value', param2:'value'};
    while(params) {
        $.getJSON("url", params, function(data) {
            if(data contains something important)
                params.foo = bar;
            else
                params = null;
        });
    }
}

但是params永远不会改变,while循环会持续下去。这似乎是一个参考问题;但我无法弄清楚如何解决这个问题。提前谢谢。

2 个答案:

答案 0 :(得分:1)

问题是getJSON是异步的。

  1. while(params)执行。这是真的,所以我们继续
  2. $.getJSON被调用。传递给它的函数此时不会被调用。它刚刚排队到子系统,以后将执行实际请求 - 异步。
  3. while(params)再次执行。传递给getJSON的回调还没有机会运行,所以params没有变化。
  4. 转到第2步。
  5. 换句话说,您创建了一个无限循环,因为处理排队回调函数的系统永远不会因为无限循环而执行。您最终要做的就是创建一个无限长的排队getJSON来电列表。

    更好的解决方案是这样的:

    function sendRequest(params) {
        $.getJSON("url", params, function(data) {
            if(data contains something important)
                params.foo = bar;
                sendRequest(params);
            else
                params = null;
                // Probably do something like requestChainFinished(params);
        });
    }
    
    sendRequest({param1:'value', param2:'value'});
    

    通过使用函数,您可以控制流,并且在调用getJSON的异步回调之前不执行其他请求。

答案 1 :(得分:0)

'params'是一个闭包变量。当异步ajax调用的响应到来时,params的值会在稍后的回调中发生变化,但是你的while循环会让JS引擎保持忙,以至于回调不会被调用。

您可以继续在响应回调中调用相同的函数,也可以像async: false一样使用$.ajax({ async: false, ...