问题描述
要使用JavaScript中的简单异步睡眠功能,await promisify(setTimeout)(ms)
可以使用!
但是如何?参数看起来错误。
- promisify传递错误回调,因此
- setTimeout的呼叫应为
setTimeout(ms,errorCallback)
这不起作用,但是可以。怎么样?
import { promisify } from 'util'
(async () => {
// const start = Date.Now()
await promisify(setTimeout)(1000)
// console.log(Date.Now() - start)
})()
node <<HEREDOC
(async () => {
// const start = Date.Now();
await require('util').promisify(setTimeout)(1000);
// console.log(Date.Now() - start);
})()
HEREDOC
背景:await setTimeout(() => {},1000)
doesn't work。 one-liner:await new Promise(resolve => setTimeout(resolve,1000))
对我不起作用(为什么?)。我们可以promisify it manually:const sleep = ms => new Promise(resolve => setTimeout(resolve,ms)); await sleep(1000)
,但这是extra function。我们可以做得更好。
解决方法
这是因为setTimeout
现在有a custom promisified function。您可以在打印setTimeout
时找到它。
> console.log(setTimeout)
{ [Function: setTimeout] [Symbol(util.promisify.custom)]: [Function] }
undefined
以非标准方式进行回调的公用函数可能具有自定义的承诺函数,而当一个函数具有自定义的承诺函数时,util.promisify
将其返回。
setTimeout
是promisify
的特殊情况。
注意:此方法具有一个针对诺言的自定义变体,可使用util.promisify()
const util = require('util'); const setTimeoutPromise = util.promisify(setTimeout); setTimeoutPromise(40,'foobar').then((value) => { // value === 'foobar' (passing values is optional) // This is executed after about 40 milliseconds. });
使用异步/等待,结果变为:
await promisify(setTimeout)(1000)