缺少回调时,`await promisifysetTimeoutms`如何工作?

问题描述

要使用JavaScript中的简单异步睡眠功能await promisify(setTimeout)(ms)可以使用!

但是如何?参数看起来错误

这不起作用,但是可以。怎么样?


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 workone-linerawait new Promise(resolve => setTimeout(resolve,1000))对我不起作用(为什么?)。我们可以promisify it manuallyconst 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将其返回。

,

setTimeoutpromisify特殊情况

根据node.js specs

注意:此方法具有一个针对诺言的自定义变体,可使用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)