2011-06-29 51 views
5

這個問題肯定可以應用到jQuery,但在這種情況下,我指的是Prototype。在原型文檔,它說,使用同步ajax調用有什麼缺點?

由於同步使用是相當 不安,通常口感不好,你 應避免更改此。認真。

我不確定使用同步ajax調用的缺點是什麼。看起來有許多實例必須等待調用返回(不使用特定的回調函數)。例如,我目前使用Prototype的onSuccess, onFailure and onComplete來處理其餘的代碼。

但是,我使用的Web服務(全部內部)跨越了大多數項目,並且我的任務是創建更多可重用代碼。一個例子是返回客戶屬性的客戶類。一個簡單的例子(記住,我只顯示保持簡單的基本功能):

Customer = Class.create({ 

    initialize: function(customerId) { 

     new Ajax.Request('some-url', { 
      method: 'get', 
      parameters: { 
       customerId: customerId 
      }, 
      onSuccess: this.setCustomerInfo.bind(this) 
     } 

    }, 

    setCustomerInfo: function(response) { 

     //for the sake of this example I will leave out the JSON validation 

     this.customerInfo = response.responseText.evalJSON(); 

    } 

}); 

因此,使用簡單的類我可以做以下的任何項目,以獲得客戶信息。

var customer = new Customer(1); 

//now I have the customer info 
document.write(customer.customerInfo.firstName); 

使用上面的代碼不會打印出客戶的名字。這是由於ajax調用是異步的。無論Web服務是否帶回客戶數據,它都會執行document.write。但我不想做任何事情,直到數據恢復並設置了客戶變量。爲了解決這個問題,我將ajax調用設置爲同步,以便瀏覽器在new Customer(1);完成之前不會繼續。

此方法似乎可行(將異步設置爲false),但閱讀Prototype文檔讓我暫停。使用這種方法有什麼缺點?還有另一種方法可以做到,效率更高嗎?

我會很感激任何反饋意見。

回答

2

大多數人對同步ajax調用感到不滿,因爲它會凍結用戶界面直到它完成,因爲它不允許代碼繼續執行直到完成。我想你可以說,在界面中造成了一個口吃。

+0

然後我也會對此表示不滿,並學習更好的代碼:) – traviss0

6

好了,除了事實,這是非常的JavaScript,它有這樣愉快的效果徹底阻斷瀏覽器的UI。這不是一個小問題。

做了一些研究,發現很酷的東西。原型基於XMLHttpRequest.open的「異步」。根據Wikipedia,這不是規範中不需要的部分,它會阻止「onreadystatechange」。

10

讓我們提醒你,JavaScript是單線程

的同步IO調用阻止整個線程

一個簡單的解決方法是使用回調使用異步編程風格。

Customer = Class.create({  
    initialize: function(customerId, cb) { 
     new Ajax.Request('some-url', { 
      method: 'get', 
      parameters: { 
       customerId: customerId 
      }, 
      onSuccess: (function() { 
       this.setCustomerInfo.apply(this, arguments); 
       cb.apply(this, arguments); 
      }).bind(this) 
     } 
    }, 
    setCustomerInfo: function(response) { 
     //for the sake of this example I will leave out the JSON validation 
     this.customerInfo = response.responseText.evalJSON(); 
    } 
}); 

var c = new Customer(1, function() { 
    document.write(customer.customerInfo.firstName); 
}); 
2

嗯,我不覺得這是一個問題,以阻止用戶界面,如果用戶正在生成加載圖像,同時調用完成。它可能與提交表單相同。

+0

問題是,用戶無法區分*是否瀏覽器掛起,因爲出現問題或者這是否是正常行爲。通常,當應用程序不再響應輸入時,我認爲它以某種方式崩潰。 –