2014-03-27 45 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') 
])