ES6提供了async/await的语法,但是我实际工作过程中遇到了一些问题,await无法强制关闭,我无法写一个线程(setTimeout)来监视await的运行状况。如果在规定时间内没有操作完成,则强制关闭await。PS:思路是通过网上的例子改进而来。
核心代码:
const makeCancelable =(promise) => {
let hasCanceled_ = false;
let a={},b={};
const wrappedPromise = new Promise((resolve, reject) => {
promise.then((val) =>
//如果Promise执行完成,判断状态是否正常返回
hasCanceled_ ? null : resolve(val)
);
promise.catch((error) =>
hasCanceled_ ? null : reject(error)
);
a=resolve;//将完成函数赋值给a
b=reject;
});
return {
promise: wrappedPromise,
cancel() {
a({isCanceled: true});
hasCanceled_ = true;
},
async start(timeout){
if(typeof timeout=="number" && timeout>0){
let host=this;
setTimeout(function(){
host.cancel();
},timeout)
}
return await wrappedPromise;
}
};
};
使用完整示例
function timeout(delay) {
console.log("延时:"+delay+"ms");
return new Promise((resolve, reject) => {
setTimeout(() => {
try {
resolve(1)
} catch (e) {
reject(0)
}
}, delay)
})
}
const makeCancelable =(promise) => {
let hasCanceled_ = false;
let a={},b={};
const wrappedPromise = new Promise((resolve, reject) => {
promise.then((val) =>
//如果Promise执行完成,判断状态是否正常返回
hasCanceled_ ? null : resolve(val)
);
promise.catch((error) =>
hasCanceled_ ? null : reject(error)
);
a=resolve;//将完成函数赋值给a
b=reject;
});
return {
promise: wrappedPromise,
cancel() {
a({isCanceled: true});
hasCanceled_ = true;
},
async start(timeout){
if(typeof timeout=="number" && timeout>0){
let host=this;
setTimeout(function(){
host.cancel();
},timeout)
}
return await wrappedPromise;
}
};
};
(async () => {
console.log("开始");
console.log("测试1");
let ss=makeCancelable(timeout(30*1000));
let s1=await ss.start(10*1000);//两种使用方法,1为设置超时时间
console.log(s1);
if(s1.isCanceled){
console.log("await被强制关闭");
}
console.log("测试2");
let ss=makeCancelable(timeout(30*1000));
setTimeout(function(){
ss.cancel();//两种使用方法,2为使用cancel方法强制关闭
},10*1000);
let s1=await ss.start();
console.log(s1);
if(s1.isCanceled){
console.log("await被强制关闭");
}
console.log("结束")
})();