javascript - 缺少回调时 `await promisify(setTimeout)(ms)` 是如何工作的?

标签 javascript node.js async-await settimeout node-promisify

对于 JavaScript 中的简单异步 sleep 函数,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 .我们可以做得更好。

最佳答案

这是因为setTimeouta custom promisified function现在。你可以在打印setTimeout时找到它。

> console.log(setTimeout)
{ [Function: setTimeout] [Symbol(util.promisify.custom)]: [Function] }
undefined

采用非标准方式进行回调的常见函数可能具有自定义 promise 函数,并且当函数具有自定义 promise 函数时,util.promisify 返回它。

关于javascript - 缺少回调时 `await promisify(setTimeout)(ms)` 是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63496666/

相关文章:

c# - 如何实现返回 Task<T> 的接口(interface)方法?

javascript - TypeScript async wait 似乎并不总是等待 ("block and come back")

javascript - 使用 jQuery 环绕元素组

javascript - '|| {}'是什么意思

node.js - 如何打破大型csv文件,在多核上处理它并使用nodeJs将结果合并为一个

node.js - findAll() 不是函数 sequelize

javascript - 在扩展类中从异步方法调用父类(super class)的异步方法

javascript - 没有返回有效的 JSON?

javascript - 控制流不在 jquery 对话框中等待

mysql - Handlebars js 不呈现 mysql 查询返回的对象数组(在 nodejs 服务器中)