缺少回调时,`await promisify(setTimeout)(ms)` 如何工作?
How does `await promisify(setTimeout)(ms)` work when the callback is missing?
对于 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)
. 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)
对于 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)
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)