取消JavaScript承诺
我正试图取消以下承诺:取消JavaScript承诺,javascript,ecmascript-6,promise,es6-promise,Javascript,Ecmascript 6,Promise,Es6 Promise,我正试图取消以下承诺: function example(cancel = Promise.reject()) { return new Promise((resolve, reject) => { const timer = setTimeout(() => resolve('jack-jack'), 5000); cancel.then((res) => { clearTimeout(timer);
function example(cancel = Promise.reject()) {
return new Promise((resolve, reject) => {
const timer = setTimeout(() => resolve('jack-jack'), 5000);
cancel.then((res) => {
clearTimeout(timer);
reject('cancelled');
}, ()=>{})
});
}
var cancel=Promise.reject();
example(cancel).then((res) => console.log('res handled:' + res)).catch((err) => console.log('err handled:' + err));
console.log('attempting cancellation of promise');
cancel=Promise.resolve();
但是我不能取消它。我在这里做错了什么?您已将拒绝的承诺分配给变量,将拒绝的承诺传递给函数,并将已解决的承诺分配给变量。变量采用的两个值是不相关的,您不能更改已确定承诺的状态 传递您可以解决的承诺:
let cancel;
let cancelPromise = new Promise((resolve) => {
cancel = resolve;
});
example(cancelPromise).then(…).catch(…);
console.log('attempting cancellation of promise');
cancel();
函数示例(cancel=Promise.reject()){
返回新承诺((解决、拒绝)=>{
const timer=setTimeout(()=>resolve('jack-jack'),5000);
取消。然后((res)=>{
清除超时(计时器);
拒绝(“取消”);
}, ()=>{})
});
}
让我们取消;
让取消承诺=新承诺((解决)=>{
取消=解决;
});
示例(取消承诺)
.then((res)=>console.log('res handled:'+res))
.catch((err)=>console.log('err handled:'+err));
console.log(“试图取消承诺”);
取消()代码>,因为您正在传递被拒绝的承诺。如果要运行cancel.then()
block,请传递已解决的承诺
函数示例(cancel=Promise.resolve()){
返回新承诺((解决、拒绝)=>{
控制台日志(取消);
常量计时器=设置超时(()=>{
决议(‘杰克杰克’),5000
});
取消。然后((res)=>{
console.log('CANCELLED');
清除超时(计时器);
拒绝(“取消”);
}, () => {})
});
}
var cancel=Promise.resolve();
示例(取消)。然后((res)=>console.log('res handled:'+res)).catch((err)=>console.log('err handled:'+err));
console.log(“试图取消承诺”);
cancel=Promise.resolve()代码>在代码中,您已经向函数传递了一个完整的(拒绝的)承诺。和cancel=Promise.resolve()在尝试取消承诺后,
将不会对传递给示例的承诺产生任何影响,因为您刚刚创建了一个新的已解决承诺
如果要取消正在运行的进程,则可能需要选择以下解决方案:
function example(helper) {
return new Promise((resolve, reject) => {
helper.cancel = function() {
clearTimeout(timer)
reject('cancelled');
}
const timer = setTimeout(() => resolve('jack-jack'), 5000);
});
}
var helper = {};
example(helper).then((res) => console.log('res handled:' + res)).catch((err) => console.log('err handled:' + err));
console.log('attempting cancellation of promise');
helper.cancel()
由于取消设置为拒绝,因此零件
cancel.then((res) => { //you cannot use then for reject, as reject cannot be resolved.
clearTimeout(timer);
reject('cancelled');
}, ()=>{})
将永远不会执行,因此您必须解决它,而不是拒绝它
函数示例(cancel=Promise.reject()){
返回新承诺((解决、拒绝)=>{
const timer=setTimeout(()=>resolve('jack-jack'),5000);
cancel.then((res)=>{//您不能将then用于拒绝
清除超时(计时器);
拒绝(“取消”);
}, ()=>{})
});
}
var cancel=Promise.resolve();//只要改变来解决问题
示例(取消)。然后((res)=>console.log('res handled:'+res)).catch((err)=>console.log('err handled:'+err));
console.log(“试图取消承诺”);
cancel=Promise.resolve();//这不会有任何效果,因为您已经通过了拒绝
如果拒绝了cancel
,则不会执行cancel.then()
。@BenjaminGruenbaum有一个关于取消的其他方法的答案,尽管我不认为它是重复的。我猜OP希望在调用示例
后取消执行,因为否则调用example
@t.niese是没有意义的。我猜他贴了一段代码只是为了澄清。他的实现可能有所不同,但是如果已经知道必须取消流程,那么为什么OP调用示例
?