2013-05-21 23 views
1

我正試圖重構我的程序。我通過使AJAX調用同步來完成工作,但現在我想以正確的方式進行。發生了什麼事是headline實例化了一個新的標題從headlines其中包含標題列表。 headlines.getRandom()從現有列表中選擇隨機標題,但是,如果列表爲空,則會進行AJAX調用以獲取更多標題。新的異步編程。我如何讓事情按照適當的順序發生在不同的物體上?

我不能完全圍繞如何使Headline對象構造函數等待調用完成而不使這兩個對象相互依賴。就目前而言,標題未能實例化,因爲它試圖從未定義的對象實例化,因爲調用沒有成功完成。

我知道回調,但是如何使用回調使一個對象等待另一個AJAX調用的成功而不進入很多對象亂倫?

headline = new Headline(headlines.getRandom(true)); 
fillHeadline(); 

如果您想了解更多信息,請參閱上述代碼。 https://github.com/raddevon/onion-or-not/blob/true-ajax/js/js.js#L104

+0

這應該給你什麼是可能的一些好的想法:https://github.com/caolan/async/ – bfavaretto

回答

2

除了回調,你已經提到。您可以使用deferred對象和promises。 例如,jQuery.Deferred

有利用遞延/諾言,而不是回調的幾個優點:

  • 承諾可以鏈接,可以做一些事情,比如jQuery的前等待幾個承諾。什麼時候() 。回調有點麻煩。
  • 您可以檢查承諾的狀態,例如在等待實際數據時顯示初始默認值。
  • 將數據的生產者消費者分開更容易。 Promise被返回並以過程/同步樣式傳遞(就像它們是實際數據一樣),這有助於避免執行路徑難以遵循的複雜的回調鏈。
0

打破了阿賈克斯的概念了一下,我會嘗試:

... 
this.refreshContent = function() { 
     // Reloads JSON file 
     $.ajax(this.url, { 

      async: false, 

      success: this.fillFromJSON.bind(this), 
... 
1

目前只有兩件事是在JavaScript是異步的:

  • 事件偵聽器
  • setTimeout
  • setInterval

AJAX在內部使用事件偵聽器。

所以您做些事情,如:

var xhr = new XMLHTTPRequest(); 
xhr.addEventlistener('readystatechanged', function() { 
    console.log(xhr.responseText); 
}); 

如果你有一個回調的工作你的代碼可能是這個樣子:

function do_ajax(url, data, callback) { 
    var xhr = new XMLHTTPRequest(); 
    xhr.open("POST", url); 
    xhr.addEventlistener('readystatechanged', function() { 
     if (xhr.readyState==4 && xhr.status==200) { 
      callback(xhr.responseText); 
     } 
    }); 
} 

do_ajax("service.php", "foo=bar", function (response) { 
    console.log(response); 
}); 

如果你有非常複雜的異步進程我建議看看PromisesHere is jQuery's take on promises

你可以這樣做:

when(async_process()).then(function (result) { 
    return do_something_asynchronous(result); // <-- the result is a promise 
}).done(function (result) { // <-- and the resolved value is the input here 
    console.log(result); 
}); 

隨着承諾你的代碼可能是這樣的:由於您使用jQuery的

headlines.getRandom(true).then(function (random_headlines) { 
    return new HeadLine(random_headlines); 
}).done(headline) { 
    console.log("And presto!", headline); 
}); 
+0

由於@raddevon正在使用jQuery,就沒有必要去這樣低級別的處理和使用XMLHttpRequest直。 jQuery提供了更高級的工具,可以更好地完成這一任務。 –

+0

如果我不公開ajax內部事件,則實際上看不到事件偵聽器在工作。 – Halcyon

相關問題