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

Mic*_*pat 35 javascript promise ecmascript-6 es6-promise

这个问题类似,但我并没有询问承诺如何起作用,我特别想知道:

在返回Promise的东西中包装setTimeout的标准/最佳方法是什么?我在想像Angular的功能,但不是Angular特有的.$timeout

Ben*_*aum 49

在浏览器中

首先没有 - 没有内置的.许多增强ES2015的图书馆承诺像蓝鸟一样鞭打它.

我认为另一个答案会混淆执行函数和延迟,它还会产生无法取消的超时.我把它写成:

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; 
}
Run Code Online (Sandbox Code Playgroud)

然后你可以这样做:

delay(1000).then(/* ... do whatever */);
Run Code Online (Sandbox Code Playgroud)

要么

 doSomething().then(function(){ return delay(1000); }).then(doSomethingElse);
Run Code Online (Sandbox Code Playgroud)

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

let delay = ms => new Promise(r => setTimeout(r, ms));
Run Code Online (Sandbox Code Playgroud)

在节点中

您可以使用util.promisifyon setTimeout来获取delay函数 - 这意味着您不必再使用new Promise构造函数.