Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
取消JavaScript承诺_Javascript_Ecmascript 6_Promise_Es6 Promise - Fatal编程技术网

取消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调用
示例