Javascript 是否有返回ES6承诺的setTimeout版本?

Javascript 是否有返回ES6承诺的setTimeout版本?,javascript,promise,ecmascript-6,es6-promise,Javascript,Promise,Ecmascript 6,Es6 Promise,与之类似,但我不想问承诺一般如何运作,我特别想知道: 用什么标准/最佳方式包装返回a的内容?我在想一些类似角度的东西,但不是角度特定的。下面是我如何实现它的: function delay(duration, func) { var args = Array.prototype.slice.call(arguments, 2); return new Promise(function (resolve) { setTimeout(function () { reso

与之类似,但我不想问承诺一般如何运作,我特别想知道:


用什么标准/最佳方式包装返回a的内容?我在想一些类似角度的东西,但不是角度特定的。

下面是我如何实现它的:

function delay(duration, func) {
  var args = Array.prototype.slice.call(arguments, 2);

  return new Promise(function (resolve) {
    setTimeout(function () {
      resolve(func.apply(null, args));
    }, duration);
  });
}
(有意选择ES5语法)


但也许有一个公共库已经做到了这一点,或者有一个更好的方法来做到这一点。

下面是我如何实现它的:

function delay(duration, func) {
  var args = Array.prototype.slice.call(arguments, 2);

  return new Promise(function (resolve) {
    setTimeout(function () {
      resolve(func.apply(null, args));
    }, duration);
  });
}
(有意选择ES5语法)

但也许有一个通用的库已经做到了这一点,或者有一个更好的方法来做到这一点。

在浏览器中 首先,没有-这是没有内置的。许多增强ES2015承诺的库,如bluebird whip

我认为另一个答案将执行函数和延迟混为一谈,它也会造成无法取消的超时。我将其简单地写为:

function delay(ms){
    var ctr, rej, p = new Promise(function (resolve, reject) {
        ctr = setTimeout(resolve, ms);
        rej = reject;
    });
    p.cancel = function(){ clearTimeout(ctr); rej(Error("Cancelled"))};
    return p; 
}
然后你可以做:

delay(1000).then(/* ... do whatever */);

如果我们只想要ES2015中的基本功能,那么它甚至更简单:

let delay = ms => new Promise(r => setTimeout(r, ms));
在节点中 您可以在
setTimeout
上使用
util.promisify
返回
delay
函数-这意味着您不必再使用
new Promise
构造函数

在浏览器中 首先,没有-这是没有内置的。许多增强ES2015承诺的库,如bluebird whip

我认为另一个答案将执行函数和延迟混为一谈,它也会造成无法取消的超时。我将其简单地写为:

function delay(ms){
    var ctr, rej, p = new Promise(function (resolve, reject) {
        ctr = setTimeout(resolve, ms);
        rej = reject;
    });
    p.cancel = function(){ clearTimeout(ctr); rej(Error("Cancelled"))};
    return p; 
}
然后你可以做:

delay(1000).then(/* ... do whatever */);

如果我们只想要ES2015中的基本功能,那么它甚至更简单:

let delay = ms => new Promise(r => setTimeout(r, ms));
在节点中
您可以在
setTimeout
上使用
util.promisify
返回
delay
函数-这意味着您不必再使用
new Promise
构造函数

如果您需要适当的取消承诺的超时类似于
clearTimeout
-直接从
设置超时
返回承诺并不方便。特别是在
try…finally
块中使用时。最好为超时操作使用单独的变量。我已经将这种方法实现为一个微小的包。其工作原理如下:

import Timeout from 'await-timeout';

async function foo() {
  const timeout = new Timeout();
  try {
    const fetchPromise = fetch('https://example.com');
    const timerPromise = timeout.set(1000).then(() => console.log('Timeout!'));
    await Promise.race([fetchPromise, timerPromise]);
  } finally {
    timeout.clear();
  }
}

在本例中,如果获取成功或出现任何错误,
console.log('timeout!'),超时肯定会被清除
将不会被调用。

如果您需要适当的取消承诺的超时类似于
clearTimeout
-直接从
设置超时
返回承诺并不方便。特别是在
try…finally
块中使用时。最好为超时操作使用单独的变量。我已经将这种方法实现为一个微小的包。其工作原理如下:

import Timeout from 'await-timeout';

async function foo() {
  const timeout = new Timeout();
  try {
    const fetchPromise = fetch('https://example.com');
    const timerPromise = timeout.set(1000).then(() => console.log('Timeout!'));
    await Promise.race([fetchPromise, timerPromise]);
  } finally {
    timeout.clear();
  }
}


在本例中,如果获取成功或出现任何错误,超时肯定会被清除,并且不会调用
console.log('timeout!')

这看起来不错。这是一段如此短的代码,我真的不认为有必要通过挖掘库来找到类似的东西。不要这样做。您应该在最低级别进行promisify-
setTimeout
,并在promise回调中移动
func
,这样可以正确捕获它的异常。这看起来很好。这是一段如此短的代码,我真的不认为有必要通过挖掘库来找到类似的东西。不要这样做。您应该在最低级别进行promisify-
setTimeout
,并在promise回调中移动
func
,在那里可以正确捕获异常。回答很好。我很高兴我现在问了这个问题。这个例子的问题是:
clearTimeout
在解析时也应该被调用。当我尝试上面@Benjamin Gruenbaum的答案的任何一个版本时,下面的代码(立即执行而不等待延迟。示例
delay(2000)。然后(console.log(“then 1”)。然后(delay(2000).then(console.log(“then 2”));
同时打印“then 1”和“then 2”两秒钟后,程序立即完成。@TimothyVann
然后
接受一个函数,而不是一个承诺。回答很好。我很高兴现在问了这个问题。这个例子的问题是:
clearTimeout
在解析时也应该被调用。当我尝试上述@Benjamin Grunbaum答案的任何一个版本时随后的代码(在不等待延迟的情况下立即执行。例如
delay(2000)。然后(console.log(“then 1”))。然后(delay(2000)。然后(console.log(“then 2”));
同时打印“then 1”和“then 2”两秒钟后,程序立即毫无延迟地完成。@Timothyvan
然后
接受一个函数,而不是一个承诺。没有看到这一个,这是我该怎么做->蓝鸟承诺库有
promise.delay()
。没有看到这一个,这是我该怎么做->蓝鸟承诺库有
promise.delay())
。这没有任何意义。您只是在等待超时已…修复后才清除超时。谢谢!这没有任何意义。您只是在等待超时已…修复后才清除超时。谢谢!