Javascript 当父母被取消时,是否可以取消子女承诺?

Javascript 当父母被取消时,是否可以取消子女承诺?,javascript,promise,bluebird,cancellation,Javascript,Promise,Bluebird,Cancellation,我有一个使用蓝鸟承诺的代码: const promise = loadSomething(id) .then(something => { loadParentOfSomething(something.parentId); return something; }); 当我承诺。取消时,getSomethingParent被取消,但getSomethingParent没有 有没有办法,当getSomething承诺被取消时,我也可以让getSomething家长承

我有一个使用蓝鸟承诺的代码:

const promise = loadSomething(id)
  .then(something => {
    loadParentOfSomething(something.parentId);
    return something;
  });
当我承诺。取消时,getSomethingParent被取消,但getSomethingParent没有

有没有办法,当getSomething承诺被取消时,我也可以让getSomething家长承诺被取消


这两个加载函数都会返回一个可取消的异步承诺和一个HTTP请求,我之所以要取消它们,是因为有时加载它们可能需要一段时间,例如,当用户导航离开时,不再需要响应

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

const promise = getSomething(id)
  .then(something => {
    getSomethingParent(something.parentId);
    return something;
  }, error => {
    console.error(error)
  });
调用promise.reject时,将不会调用getSomethingParent。

如果您准备了一个引用LoadSomeThingOffParent的虚拟承诺,您应该能够在loadSomething中取消它

loadSomething将需要一个onCancel处理程序,该处理程序将在承诺取消时执行

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

    // The `.cancel()` handler
    onCancel(function() {
      promise.cancel();
    });
  });
}

我想你到底在找什么

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结算后,也可以取消此操作。

getSomethingParent已被调用。因此getSomething承诺已经实现,但getSomethingParent尚未实现。我希望在调用cancel时取消getSomethingParent,而不管getSomething的状态如何。如果这有道理的话。不,它没有,它只有在完成某项任务后才会被调用。这就是为什么它被放在then中。如果getSomething承诺已经实现,那么您如何取消它?错误是否被捕获与getSomethingParent甚至一般取消完全无关。@Bergi默认情况下,如果未定义错误函数,则在成功和错误情况下都会调用then回调。因此,如果用户希望处理承诺被拒绝的情况,那么定义错误函数将有所帮助。下面是一个getSomethingParent是一个可以取消的异步任务吗?它现在看起来很像一个同步函数——并且你对它的结果没有做任何事情。是的,它还返回一个可取消的承诺。对不起,我应该说得更清楚。但你不是在做任何事情,而是把承诺扔掉?你没有收到蓝鸟的警告吗?我没见过。这是一个承诺,它最终会通过存储触发一个加载的事件,尽管它正在做一些事情。正因为如此,promise不知道这件事,也没有取消它的动机。这不起作用-promise in loadSomething总是指承诺。解决虚拟承诺,而不是它的替代品。JS没有通过引用传递。此外,我怀疑onCancel回调是否会在名为resolve/reject的loadSomething承诺之后运行。实际上,我尝试过这样做,但似乎没有任何区别,因此这里可能会发生其他情况…或者也许我不明白蓝知更鸟是怎么取消的。让我们等待Benjamin Gruenbaum来确认。通过不进行父级加载来解决问题,因为事实证明父级数据实际上是作为某个内容的一部分返回的。parent。虽然它只是一个小片段,但在仔细查看之后,它实际上与从loadParentOfSomething返回的数据几乎相同。但是,如果有人能解释一下这次取消,那就太好了,因为我真的认为应该是这样的。
const promise1 = loadSomething(id);
const promise2 = promise1.then(something => { return loadParentOfSomething(something.parentId); });
//                                            ^^^^^^
promise2.catch(e => void "ignore"); // prevent unhandled rejections