缺少回调时,`await promisify(setTimeout)(ms)` 如何工作?

How does `await promisify(setTimeout)(ms)` work when the callback is missing?

对于 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). This : await new Promise(resolve => setTimeout(resolve, 1000)) did not work for me (why?). We can : const sleep = ms => new Promise(resolve => setTimeout(resolve, ms)); await sleep(1000), but that is an extra function。我们可以做得更好。

这是因为 setTimeout 现在有 a custom promisified function。打印setTimeout.

就可以找到
> console.log(setTimeout)
{ [Function: setTimeout] [Symbol(util.promisify.custom)]: [Function] }
undefined

采用非标准方式回调的常用函数可能具有自定义承诺函数,并且 util.promisify returns 当函数具有自定义承诺函数时。

setTimeout特例 promisify

根据 node.js specs:

Note: This method has a custom variant for promises that is available using 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.
});

与 async/await 一起变为:

await promisify(setTimeout)(1000)