Отменить обещание JavaScript - PullRequest
0 голосов
/ 02 июля 2018

Я пытаюсь отменить обещание, указанное ниже:

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();

Однако я не могу отменить его. Что я здесь не так делаю?

Ответы [ 4 ]

0 голосов
/ 02 июля 2018

Так как отмена настроена на отклонение, тогда часть

cancel.then((res) => { //you cannot use then for reject, as reject cannot be resolved.
    clearTimeout(timer);
     reject('cancelled'); 
}, ()=>{})

никогда не будет исполнено, поэтому вы должны разрешить его, а не отклонить

function example(cancel = Promise.reject()) {
    return new Promise((resolve, reject) => {
        const timer = setTimeout(() => resolve('jack-jack'), 5000);
        cancel.then((res) => { //you cannot use then for reject
            clearTimeout(timer);
            reject('cancelled'); 
        }, ()=>{})
    });
}

var cancel = Promise.resolve(); // just change to resolve

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(); // this will have no effect as you have already passed a reject
0 голосов
/ 02 июля 2018

Потому что вы передаете отклоненное обещание. Передайте выполненное обещание, если хотите, чтобы блок cancel.then() работал.

function example(cancel = Promise.resolve()) {
  return new Promise((resolve, reject) => {
    console.log(cancel);
    const timer = setTimeout(() => {
      resolve('jack-jack'), 5000
    });
    cancel.then((res) => {
      console.log('CANCELLED');
      clearTimeout(timer);
      reject('cancelled');
    }, () => {})
  });
}
var cancel = Promise.resolve();
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();
0 голосов
/ 02 июля 2018

В своем коде вы передаете уже полное (отклоненное) обещание функции. И cancel=Promise.resolve(); после attempting cancellation of promise не будет иметь никакого эффекта для обещания, которое было передано example, потому что вы просто создаете новое разрешенное Обещание.

Если вы хотите отменить запущенный процесс, вы можете выбрать такое решение:

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()
0 голосов
/ 02 июля 2018

Вы присвоили отклоненное обещание переменной, передали отклоненное обещание в вашу функцию и присвоили разрешенное обещание переменной. Два значения, которые принимает переменная, не связаны, и вы не можете изменить состояние урегулированного обещания.

Передайте обещание, которое вы можете решить:

let cancel;
let cancelPromise = new Promise((resolve) => {
    cancel = resolve;
});

example(cancelPromise).then(…).catch(…);
console.log('attempting cancellation of promise');
cancel();

function example(cancel = Promise.reject()) {
    return new Promise((resolve, reject) => {
        const timer = setTimeout(() => resolve('jack-jack'), 5000);
        cancel.then((res) => {
            clearTimeout(timer);
            reject('cancelled'); 
        }, ()=>{})
    });
}

let cancel;
let cancelPromise = new Promise((resolve) => {
    cancel = resolve;
});

example(cancelPromise)
    .then((res) => console.log('res handled:' + res))
    .catch((err) => console.log('err handled:' + err));
console.log('attempting cancellation of promise');
cancel();
...