如何取消 Javascript Promise 内部的超时?

2024-03-31

我正在玩弄 JavaScript 中的承诺并尝试承诺 setTimeout 函数:

function timeout(ms) {
  return new Promise(function(resolve, reject) {
    setTimeout(function() {
      resolve('timeout done');
    }, ms);
  }); 
}

var myPromise=timeout(3000); 

myPromise.then(function(result) { 
  console.log(result); // timeout done
})

相当简单,但我想知道如何在承诺解决之前取消超时。timeout回报Promise对象因此我无法访问该值setTimeout返回并且无法通过取消超时clearTimeout。最好的方法是什么?

顺便说一句,这样做没有真正的目的,我只是想知道如何实现这一点。我也把它扔在这里http://plnkr.co/edit/NXFjs1dXWVFNEOeCV1BA?p=preview http://plnkr.co/edit/NXFjs1dXWVFNEOeCV1BA?p=preview


编辑2021所有平台都集中在 AbortController 作为取消原语,并且有一些对此的内置支持。

在 Node.js 中

// import { setTimeout } from 'timers/promises' // in ESM
const { setTimeout } = require('timers/promises');
const ac = new AbortController();

// cancellable timeout
(async () => {
  await setTimeout(1000, null, { signal: ac.signal });
})();

// abort the timeout, rejects with an ERR_ABORT
ac.abort();

在浏览器中

您可以填充此 API 并使用与上面示例相同的内容:


function delay(ms, value, { signal } = {}) {
    return new Promise((resolve, reject) => {
        const listener = () => {
            clearTimeout(timer);
            reject(signal.reason);
        };
        signal?.throwIfAborted();
        const timer = setTimeout(() => {
            signal?.removeEventListener('abort', listener);
            resolve(value);
        }, ms);
        signal?.addEventListener('abort', listener);
    });
}

你能做什么,你可以从你的timeout函数并在需要时调用它。这样你就不需要存储timeoutid全局(或外部范围),这也可以管理对函数的多次调用。函数返回对象的每个实例timeout将有自己的取消程序可以执行取消操作。

function timeout(ms) {
  var timeout, promise;

  promise = new Promise(function(resolve, reject) {
    timeout = setTimeout(function() {
      resolve('timeout done');
    }, ms);
  }); 

  return {
           promise:promise, 
           cancel:function(){clearTimeout(timeout );} //return a canceller as well
         };
}

var timeOutObj =timeout(3000); 

timeOutObj.promise.then(function(result) { 
  console.log(result); // timeout done
});

//Cancel it.
timeOutObj.cancel();

Plnkr http://plnkr.co/edit/tydVRb?p=preview

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何取消 Javascript Promise 内部的超时? 的相关文章

随机推荐