问题简介
我需要在循环中调用异步函数,直到满足条件。这个特定的函数向网站form.php发送一个 POST 请求,并对响应执行一些操作,响应是一个 JSON 字符串,表示具有id字段的对象。因此,当该 id 为空时,外部循环必须结束。该函数执行以下操作:
function asyncFunction(session) {
(new Request({
url: form.php,
content: "sess=" + session,
onComplete: function (response) {
var response = response.json;
if (response.id) {
doStaff(response.msg);
} else {
// Break loop
}
}
})).get();
}
注意:虽然我发现了为 Firefox 实现附加组件的问题,但我认为这是一个一般的 javascript 问题。
递归实现循环
我已经尝试通过递归来实现循环,但它不起作用,我不确定这是正确的方法。
...
if (response.id) {
doStaff(response.msg);
asyncFunction(session);
} else {
// Break loop
}
...
使用 jsdeferred
我也尝试过使用 jsdeferred 库:
Deferred.define(this);
//Instantiate a new deferred object
var deferred = new Deferred();
// Main loop: stops when we receive the exception
Deferred.loop(1000, function() {
asyncFunction(session, deferred);
return deferred;
}).
error(function() {
console.log("Loop finished!");
});
然后调用:
...
if (response.id) {
doStaff(response.msg);
d.call();
} else {
d.fail();
}
...
我实现了序列化,但它开始为每次迭代重复以前的调用。例如,如果它是第三次调用 asyncFunction,它将在迭代 1 和 2 中调用具有相应参数的相同函数。