2010-12-03 41 views
9

我需要在JavaScript中編寫一個函數,它從調用異步函數返回一個狀態。但是,調用者只接收該值並且不提供回調函數。我想是這樣的:如何在JavaScript中阻止異步功能

function getState() { 
    var ret = null; 
    asyncCall("request", 
     function() { ret = "foo"; } // callback 
    ); 
    while (ret === null) 
     ; // block on the asynchronous call 
    return ret; 
} 

然而,循環永遠不會結束......

任何想法?謝謝。

+2

爲什麼要首先阻止異步調用?這樣做沒有意義。 – Tomalak 2010-12-03 13:30:21

+1

@Tomolak:因爲這是由Firefox提供的調用,我無法更改它。預計最多需要幾毫秒,因此我不想重構所有其他代碼。 – 2010-12-03 13:32:49

+0

你可以發佈調用`getState()`的函數嗎? – Tomalak 2010-12-03 13:39:39

回答

8

我認爲你正在尋找StratifiedJS,http://stratifiedjs.org 它可以讓你「編排」就像你寫你的異步代碼,要注意的是它「寫」之類的同步碼,它不會阻止你的其他應用程序。 您可以通過加載apollo js庫在任何地方使用它。

這是它會是什麼樣子在分層的JavaScript:當然

function getState() { 
    waitfor (var ret) { 
    // block on the asynchronous call 
    asyncCall("request", resume); 
    } 
    return ret; 
} 

有模塊/庫,只會使它看起來像這樣: http://onilabs.com/modules#http

function getState() { 
    return http.get("request"); 
} 
0

爲什麼不乾脆:

asyncCall("request", function() { 
    // here you can inspect the state 
}); 

什麼是包裝函數的意義呢?

異步函數以這種方式工作。如果要阻止執行,請使用同步呼叫:

var state = syncCall("request"); 
1

最好的做法是將要調用的邏輯放入回調函數中。你有什麼理由不能這樣做?

你可以使用setInterval來檢查的結果,但是這需要一個回調函數,太...

1

除非我誤解你的問題,你可以看看jQuery的ajaxStop()事件 - http://api.jquery.com/ajaxstop。這會阻塞,直到所有ajax調用完成。這顯然需要通過jQuery完成所有的異步調用。

$(document).ajaxStop(function() { 
    // do your "ajax dependent" stuff here 
});