2012-04-09 31 views
3

簡短版本: 尋找等待異步XHR請求的方法或獲得Synch XHR在Safari中工作的方法。Javascript Synchronous XMLHttpRequest的替代品(在Safari中超時)

更長的版本: 我正在使用各種外部數據源混合在一起的Web服務。我正在使用一個JavaScript前端,它可以對我的PHP服務器代碼進行AJAX/XHR調用。沒有跨站點問題,因爲客戶端只向我的服務器請求數據(服務器發出外部數據請求)。

我使用的是同步XHR請求,因爲我有一些後加載處理(排序,過濾等)在數據顯示在屏幕上之前做的。

這一切都適用於IE瀏覽器,FF和Opera,但似乎是Safari的問題(我還沒有嘗試Chrome)。

在Windows機器上使用Firebug for Safari我可以看到服務器調用了beng,然後在10秒以上的時間後失敗。在我的iPad上,該消息略微有點像以下所示:NETWORK_ERR:XMLHttpRequest異常101:在同步模式下發生網絡錯誤。

一些研究表明,Safari會在同步模式下10秒後超時。似乎有一個超時功能,您可以使用該超時功能來擴展此功能(對於60秒的Safari最大限制)。不幸的是我無法得到這個工作。

我現在想知道人們會通過改變客戶端Javacript代碼來解決這個問題。

我在考慮的兩個選項是(i)找到Safari瀏覽器將會遵守的同步XHR超時的工作示例;或者(ii)圍繞異步XHR呼叫進行某種包裝,以便後裝處理首先等待負載。

我不是一個經驗豐富的Javascript黑客,但我在這個項目上設置了相當數量。我沒有使用JQuery或任何其他框架,寧願保留原始JS,以避免學習其他語法。 [你可能會從我以前的帖子中看到我過去嘗試過使用JQM和Spry,但都被證明是錯誤的選擇,至少在現階段已經被拋棄了]。

我感覺回調可能是正確的等待選項,但我不確定這是如何工作的,或者如何編寫它。

這只是在這個階段的原型,所以骯髒的黑客是可以接受的。一旦我已經證明了功能,完整的重寫已經在卡片上。

欣賞人們對此的想法和建議。

Regards, Pete。

+0

我不會對這個具體問題有很大幫助,因爲它的自從我寫了一本「老派」AJAX電話以來一直是永遠的。 我肯定你會重新訪問jQuery - 如果不是現在,很快。您可以在幾行中通過多個瀏覽器一次又一次地測試複雜的AJAX調用。我曾經拒絕學習jQuery,但現在我意識到這是一個錯誤。所有這些都值得花時間學習單獨的強大,更穩定(更易於使用)的AJAX調用。 – CWSpear 2012-04-09 16:56:26

+0

嗨@Volkner。我認爲jQuery在不久的將來可能會是明智的選擇,但如果是poss,我更願意使用JS的原始解決方法。這是一個優先事項,我渴望儘快讓我的原型原型工作,並儘可能避免花時間學習其他/替代品。 – 2012-04-09 17:11:10

回答

2

通常,您會想要堅持異步請求,因爲它們是非阻塞的。與他們一起,你會想要使用回調 - 或者,簡單來說,一個設置稍後調用的函數。

您可以設置回調函數的onreadystatechange property一個XMLHttpRequest

xhr.onreadystatechange = function() { 
    if (xhr.readyState === 4) { // DONE 
     if (xhr.status === 200) { // OK 
      handleSuccess(xhr); 
     } else { 
      handleError(xhr); 
     } 
    } 
}; 

由於物業顧名思義,它會被稱爲爲readyState變化,其中4值表示請求的值已完成(成功與否)。

然後,您會在另一個函數中處理您的排序,過濾等,在本例中爲handleSuccess

您也可以使用任何一種現有的庫中受益 - 例如,jQuery(本段1.6或更高版本):

$.get('/web/service/request') 
    .done(function (result) { 
     // sorting, filtering, etc 
    }) 
    .fail(function (xhr) { 
     // error notification, etc. 
    }); 
+0

謝謝@Jonathan當我讀完這篇文章後,我意識到我已經看到過這種方法。我會放棄它。謝謝。 – 2012-04-09 17:17:43

+0

賓果!這工作。再次感謝。 – 2012-04-09 18:18:47