Можно ли отменить детское обещание, если родитель отменен? - PullRequest
0 голосов
/ 21 февраля 2019

У меня есть этот код (с помощью Bluebird Promise):

const promise = loadSomething(id)
  .then(something => {
    loadParentOfSomething(something.parentId);
    return something;
  });

Когда я затем выполняю promise.cancel(), getSomething отменяется, а getSomethingParent - нет.

Есть ли способ, когда getSomething обещание отменяется, я также могу получить обещание getSomethingParent отменить?

Обе функции загрузки возвращают отменяемое асинхронное обещание с HTTP-запросом и причину, по которой я хочуотменить их можно потому, что иногда их загрузка может занять некоторое время, и когда, например, пользователь уходит (SPA), ответ больше не нужен.

Ответы [ 3 ]

0 голосов
/ 21 февраля 2019

Если вы подготовите фиктивное обещание со ссылкой на loadSomethingOfParent, вы сможете отменить его в течение loadSomething.

// Create a dummy promise to reference `loadParentOfSomething`
var dummyPromise = Promise.resolve(); 

// Pass `dummyPromise` to `loadSomething`
const promise = loadSomething(id, dummyPromise).then(something => {
  dummyPromise = loadParentOfSomething(something.parentId);
  return something;
});

loadSomething потребуется обработчик onCancel, который будет выполняться, когдаОбещание отменено.

function loadSomething(id, promise) {
  return new Promise(function(resolve, reject, onCancel) {
    // Do your stuff

    // The `.cancel()` handler
    onCancel(function() {
      promise.cancel();
    });
  });
}
0 голосов
/ 21 февраля 2019

Я думаю, что вы на самом деле ищете

const promise1 = loadSomething(id);
const promise2 = promise1.then(something => { return loadParentOfSomething(something.parentId); });
//                                            ^^^^^^
promise2.catch(e => void "ignore"); // prevent unhandled rejections

Тогда вы можете продолжать использовать promise1 для доступа к результату, но также вызывать promise2.cancel().Эта отмена будет возможна даже после расчета promise1.

0 голосов
/ 21 февраля 2019

Определить функцию в качестве второго параметра обратного вызова then.Пример:

const promise = getSomething(id)
  .then(something => {
    getSomethingParent(something.parentId);
    return something;
  }, error => {
    console.error(error)
  });

Когда вы звоните promise.reject(), getSomethingParent не будет вызываться. Ссылка

...