Javascript 与x27之间的差异;实用程序promisify(设置超时)和#x27;和';ms=>;新承诺(解析=>;设置超时(解析,毫秒))&x27;

Javascript 与x27之间的差异;实用程序promisify(设置超时)和#x27;和';ms=>;新承诺(解析=>;设置超时(解析,毫秒))&x27;,javascript,node.js,Javascript,Node.js,环境:节点8.11.x 我想使用async/await睡眠一会儿 const sleep = ms => new Promise(resolve => setTimeout(resolve, ms)) await sleep(5000) 这很有效 const sleep = util.promisify(setTimeout) await sleep(5000) 它会导致异常:TypeError:“callback”参数必须是函数。 文档说明:此方法有一个用于承诺的自定义变量,可

环境:节点8.11.x 我想使用async/await睡眠一会儿

const sleep = ms => new Promise(resolve => setTimeout(resolve, ms))
await sleep(5000)
这很有效

const sleep = util.promisify(setTimeout)
await sleep(5000)
它会导致异常:TypeError:“callback”参数必须是函数。 文档说明:此方法有一个用于承诺的自定义变量,可使用util.promisify()使用


那么有什么区别呢

promisify
需要一个具有最终参数(回调)的函数

换句话说,它需要一个如下所示的函数:

function takesACallback(str, Fn) {
    Fn(null, "got: ", str)
    // or with an error:
    // Fn(error)
}
当然,
setTimout
恰恰相反。要传入的参数是最后一个参数。因此,当您尝试调用
promisify
d函数并传入一个参数时,它将接受该参数——延迟——并尝试像函数一样调用它。当然这是个错误

仅出于娱乐(和轻微的教育)目的,您可以传入一个反转参数的函数,该函数将起作用:

let util = require('util')

let pause = util.promisify((a, f) => setTimeout(f, a))
pause(2000)
.then(() => console.log("done"))

现在,传递给
promisify
的函数的最后一个参数需要函数。但是
asyn/await
方法是,因此更好…

您知道,这里的方法很有效:

const {promisify} = require('util');
const sleep = promisify(setTimeout);

;(async () => {

  const ts = Date.now()

  await sleep(5000)

  console.log(Date.now()-ts)

})();

这很好用,为什么不使用它呢?

这可以是一行:
等待承诺(setTimeout)(1000)

它之所以有效,是因为setTimeout有一个。它确实适用于节点8.11

nvm install 8.11 && nvm use 8.11
node <<HEREDOC
  (async () => {
    // const start = Date.now();
    await require('util').promisify(setTimeout)(5000);
    // console.log(Date.now() - start);
  })()
HEREDOC
nvm安装8.11和&nvm使用8.11

我被娱乐和教育了pYou说
但是asyn/await方法好得多
-但是这仍然需要一个promisified超时,不是吗?是的,您仍然需要创建承诺,但是我认为带有反向参数的
util.promisify
非常混乱。也许这么好有点言过其实了。
let p=util.promisify(setTimeout.bind(null,cb=>cb())似乎有效:p(为了更多的娱乐和教育)文档注意:这个方法有一个承诺的自定义变量,可以使用util.promisify()来实现,这个自定义变量非常有趣-你知道它的有趣之处吗?你说的代码“导致异常”。。。在节点10.8.0中不起作用,所以8.11.x中可能有一个bug(不管是什么)