function timeoutPromise(promise, ms){
var timeout = new Promise(function(resolve,reject){
setTimeout(function(){
reject("异步操作超时")
},ms);
})
return Promise.race([promise, timeout]);
}
//运行实例
var taskPromise = new Promise(function(resolve){
//随便一些什么处理
var delay = Math.random() * 2000;
setTimeout(function(){
resolve(delay + "ms");
},delay)
})
timeoutPromise(taskPromise, 1000).then(function(value){
console.log("taskPromise在规定时间内结束:" + value);
}).catch(function(error){
if(error){
console.log(error);
}
})
本例是看完这篇文章之后,想到的自觉比原例更简单的一个实现方式。也可能是某些地方没有考虑到,欢迎指正!
原例:
function delayPromise(ms){
return new Promise(function(resolve){
setTimeout(resolve,ms);
})
}
function timeoutPromise(promise, ms){
var timeout = delayPromise(ms).then(function(){
throw new Error('Operation timed out after ' + ms + 'ms');
});
return Promise.race([promise, timeout]);
}
//运行实例
var taskPromise = new Promise(function(resolve){
//随便一些什么处理
var delay = Math.random() * 2000;
setTimeout(function(){
resolve(delay + "ms");
},delay)
})
timeoutPromise(taskPromise, 1000).then(function(value){
console.log("taskPromise在规定时间内结束:" + value);
}).catch(function(error){
console.log("发生超时", error);
})
这里面超时处理函数中的promise
最终都会调用resolve
,然后手动的抛出一个Error
,使外面的promise
调用reject
回调,然后触发Promise.race()
的reject
。我不知道作者是因为考虑到什么因素才会想到去手动抛出一个错误的方法,我觉着直接让第一个Promise
调用reject
回调,从而链到后面的一系列操作。