我正在使用ember.js和RSVP。RSVP - 使用承諾處理超時
從我可以看到,沒有任何處理來自異步調用的超時。
我的想法是使用裝飾器模式封裝解析處理程序,將解析處理程序包裝在某些代碼中,以便在發生超時時會調用並調用拒絕。
這聽起來像是一個好主意,還是有一些內置的支持超時,我已經錯過了RSVP。
我正在使用ember.js和RSVP。RSVP - 使用承諾處理超時
從我可以看到,沒有任何處理來自異步調用的超時。
我的想法是使用裝飾器模式封裝解析處理程序,將解析處理程序包裝在某些代碼中,以便在發生超時時會調用並調用拒絕。
這聽起來像是一個好主意,還是有一些內置的支持超時,我已經錯過了RSVP。
你可以這樣做,但是這可能應該由任何正在做異步操作的人來處理。 如果你使用jQuery的阿賈克斯,那麼:
$.ajax({
//...
timeout: 1000 * 10 // 10 seconds
//...
})
如果你控制了服務器端,並期望擁堵,那麼你應該在這個水平中斷長時間運行的進程,並返回一個錯誤。
對於不使用jQuery的應用程序,您可以創建一個承諾對象,引發超時錯誤並使用Promise.race
運行您的任務以獲取第一個結果。
/**
* @param {number} msWait
* @param {string} error - error message
* @return {Promise}
*/
const promiseTimeout = (msWait, error) => {
return new Promise((resolve, reject) => {
setTimeout(() => reject(new TimeoutError(error)), msWait)
})
}
// Run tasks with timeout error
Promise.race([
Android.detector(),
IOS.detector(),
promiseTimeout(settings.platformDetectionTimeout, 'Can\'t detect your platform')
])