簡介問題循環中調用異步函數
我需要,直到條件滿足調用一個循環內的異步函數。這個特定的函數發送一個POST請求到一個網站form.php,並執行一些操作與響應,這是一個JSON字符串表示一個對象與ID字段。所以,當該id爲null時,外部循環必須結束。該函數類似以下內容:
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中的相應參數相同的函數。
我明白你的意思了,但是,我可以使用其他什麼策略?必須有一些模式來執行我想要做的事情,對吧? – synack 2012-07-11 14:17:33
我剛纔描述了這個策略。代碼可以採用一些不同的形式,但基本上你沒有選擇。 @Kayo給出了一個實際代碼的例子,但是你會看到在「完成」函數中(這將通過完成異步過程來觸發),調用「newAsyncRequest」函數。 – Pointy 2012-07-11 14:43:32