2014-03-27 83 views
4

我正在使用ember.js和RSVP。RSVP - 使用承諾處理超時

從我可以看到,沒有任何處理來自異步調用的超時。

我的想法是使用裝飾器模式封裝解析處理程序,將解析處理程序包裝在某些代碼中,以便在發生超時時會調用並調用拒絕。

這聽起來像是一個好主意,還是有一些內置的支持超時,我已經錯過了RSVP。

回答

1

你可以這樣做,但是這可能應該由任何正在做異步操作的人來處理。 如果你使用jQuery的阿賈克斯,那麼:

$.ajax({ 
    //... 
    timeout: 1000 * 10 // 10 seconds 
    //... 
}) 

如果你控制了服務器端,並期望擁堵,那麼你應該在這個水平中斷長時間運行的進程,並返回一個錯誤。

1

對於不使用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') 
])