缺少回调时,"await promisify(setTimeout)(ms)"如何工作? [英] How does `await promisify(setTimeout)(ms)` work when the callback is missing?
问题描述
对于JavaScript中的简单异步睡眠功能,await promisify(setTimeout)(ms)
可以使用!
For a simple async sleep function in JavaScript, await promisify(setTimeout)(ms)
works!
但是如何?参数看起来错误.
But how? The arguments look wrong.
- promisify 传递错误回调,所以
- setTimeout 调用将是
setTimeout(ms, errorCallback)
- promisify passes an error callback, so the
- setTimeout call would be
setTimeout(ms, errorCallback)
这不起作用,但确实可以.怎么样?
which should not work, yet it does. How?
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)
无法正常工作. 单线:await new Promise(resolve => setTimeout(resolve, 1000))
对我不起作用(为什么?).我们可以手动对其进行承诺:const sleep = ms => new Promise(resolve => setTimeout(resolve, ms)); await sleep(1000)
,但这是
Background: await setTimeout(() => {}, 1000)
doesn't work. This one-liner: await new Promise(resolve => setTimeout(resolve, 1000))
did not work for me (why?). We can promisify it manually: const sleep = ms => new Promise(resolve => setTimeout(resolve, ms)); await sleep(1000)
, but that is an extra function. We can do better.
推荐答案
This is because setTimeout
has a custom promisified function now. You can find it when you print setTimeout
.
> console.log(setTimeout)
{ [Function: setTimeout] [Symbol(util.promisify.custom)]: [Function] }
undefined
以非标准方式进行回调的公用函数可能具有自定义的承诺函数,而util.promisify
在函数具有自定义的承诺函数时将其返回.
Common functions that take a callback not in the standard way may have a custom promisified function, and util.promisify
returns it when a function has a custom promisified function.
这篇关于缺少回调时,"await promisify(setTimeout)(ms)"如何工作?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!