代码之家  ›  专栏  ›  技术社区  ›  johannchopin

如何使用AbortController拒绝子Promise

  •  1
  • johannchopin  · 技术社区  · 2 年前

    我刚刚学会了如何使用 AbortController API 。它工作得很好,但当承诺作为“孩子的承诺”拒绝时,即使父母的承诺被拒绝,这个承诺仍将继续运行。

    当父母被拒绝时,有没有办法也阻止孩子?

    在这个例子中,这意味着没有更多 running 在之后登录 rejected 单击取消按钮时记录:

    let controller = new AbortController();
    
    new Promise((resolve, reject) => {
      setInterval(() => console.log("running"), 500)
    
      controller.signal.addEventListener('abort', () => {
        console.log("rejected")
        reject();
      });
    
    });
    
    function cancel() {
      controller.abort();
    }
    <button onclick="cancel()">Cancel async loop</button>
    1 回复  |  直到 2 年前
        1
  •  1
  •   n1md7    2 年前

    Promise和abort控制器都很好——需要清除的是您的计时器功能。

    当你申报 setInterval 它返回一个id,稍后可以引用该id来清除计时器。

    所以,当你拒绝承诺时,你需要澄清。

    let controller = new AbortController();
    
    new Promise((resolve, reject) => {
      const id = setInterval(() => console.log("running"), 500)
    
      controller.signal.addEventListener('abort', () => {
        console.log("rejected");
        clearInterval(id);
        reject();
      });
    
    });
    
    function cancel() {
      controller.abort();
    }
    <button onclick="cancel()">Cancel async loop</button>