我正在尝试发送请求然后在回调函数中,更改参数然后再次发送请求。像这样:
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
循环会持续下去。这似乎是一个参考问题;但我无法弄清楚如何解决这个问题。提前谢谢。
答案 0 :(得分:1)
问题是getJSON
是异步的。
while(params)
执行。这是真的,所以我们继续$.getJSON
被调用。传递给它的函数此时不会被调用。它刚刚排队到子系统,以后将执行实际请求 - 异步。while(params)
再次执行。传递给getJSON
的回调还没有机会运行,所以params
没有变化。换句话说,您创建了一个无限循环,因为处理排队回调函数的系统永远不会因为无限循环而执行。您最终要做的就是创建一个无限长的排队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, ...