父母被取消后,是否可以取消孩子承诺?

时间:2019-02-21 13:04:12

标签: javascript promise bluebird cancellation

我有此代码(使用Bluebird Promise):

  USERS.each { |user| example.duplicate_with(user: user) }

然后我进行const promise = loadSomething(id) .then(something => { loadParentOfSomething(something.parentId); return something; }); 时,promise.cancel()被取消,但getSomething未被取消。

是否有办法取消getSomethingParent承诺,我也可以取消getSomething承诺?

两个加载函数都返回一个带有HTTP请求的可取消的异步承诺,而我想取消它们的原因是因为它们有时可能需要一段时间才能加载,并且例如当用户导航(SPA)时,响应不再需要。

3 个答案:

答案 0 :(得分:0)

我认为您实际上在寻找什么

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解决之后,这种取消也是可能的。

答案 1 :(得分:-1)

将函数定义为then回调的第二个参数。示例:

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

当您致电promise.reject()时,将不会呼叫getSomethingParentReference

答案 2 :(得分:-2)

如果您准备引用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();
    });
  });
}