這是Javascript的常見問題。 Javascript代碼必須以連續傳遞方式編寫。它的煩人,但它的東西,你可以轉換,而不用想太多。
Basicaly,每當我們會碰到這樣的
var x = someSyncFunction(a, b, c);
//do something with x
console.log(x);
我們可以將它通過使所有的代碼的函數返回到一個連續函數之後和可變轉向x轉換的參數轉換成異步代碼繼續回調。
someAsyncFunction(a, b, c, function(x){
//do something with x;
console.log(x);
});
你必須小心,它很容易寫易混淆的代碼。要牢記的一個好方法是你可以讓自己的函數也接收回調。這使得他們可以使用不同的功能(就像正常的同步助手函數返回值可以通過不同的功能使用)
var getXyz = function(onResult){ //async functions that return do so via callbacks
//you can also another callback for errors (kind of analogous to throw)
$.get('http://www.someurl.com/123=json', function(data) {
var xyz = data.positions[0].latitude;
onResult(xyz); //instead of writing "return xyz", we pass x to the callback explicitely.
});
};
getXyz(function(xyz){ //this would look like "var xyz = getXyz();" if it were sync code instead.
console.log('got xyz');
});
這裏的技巧是改變從函數的所有return語句到來電來回調函數。認爲異步函數永遠不會返回,將值返回給某人的唯一方法是將該值傳遞給回調函數。
你可能會問,爲什麼沒有更簡單的方法來做到這一點。那麼,除非你使用另一種語言,而不是Javascript(或者至少可以讓你在同步風格中編寫異步代碼,但是會自動編譯爲常規Javascript)
如果您將'var'關鍵字移出函數並且在你的初始'xyz'前面,那麼你可以在你的ajax請求完成後執行的任何函數中在該範圍內的任何地方使用它。 – Paulpro
雖然* * **同步** AJAX(在jQuery中記錄*),但通常應該避免*,因爲它對用戶體驗有負面影響。相反,請專注於使用基於事件的異步AJAX模型。也就是說,在回調中用'xyz' *更新DOM。 – 2012-06-10 22:44:40
@pst。一直都有同樣的問題。這一個和DOM準備好的問題。 – gdoron