与这个问题类似,但我并没有询问承诺如何起作用,我特别想知道:
在返回Promise的东西中包装setTimeout的标准/最佳方法是什么?我在想像Angular的功能,但不是Angular特有的.$timeout
首先没有 - 没有内置的.许多增强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; }
然后你可以这样做:
delay(1000).then(/* ... do whatever */);
要么
doSomething().then(function(){ return delay(1000); }).then(doSomethingElse);
如果我们只想要ES2015中的基本功能,它甚至更简单:
let delay = ms => new Promise(r => setTimeout(r, ms));
您可以使用util.promisify
on setTimeout
来获取delay
函数 - 这意味着您不必再使用new Promise
构造函数.