Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

difference between 'util.promisify(setTimeout)' and 'ms => new Promise(resolve => setTimeout(resolve, ms))'

Environment: node 8.11.x I want use async/await for sleep a while.

const sleep = ms => new Promise(resolve => setTimeout(resolve, ms))
await sleep(5000)

This works.

const sleep = util.promisify(setTimeout)
await sleep(5000)

It cause a exception: TypeError: "callback" argument must be a function. setTimeout The document note: This method has a custom variant for promises that is available using util.promisify()

So what's the difference?

like image 377
xingfinal Avatar asked Nov 29 '22 21:11

xingfinal


1 Answers

promisify is expects a function that has final argument that is the callback.

In other a words it wants a function that looks like:

function takesACallback(str, Fn) {
    Fn(null, "got: ", str)
    // or with an error:
    // Fn(error)
}

Of course setTimout is the opposite. The argument you want to pass in is the last argument. So when you try to call the promisifyd function and pass in an argument, it will take that argument -- the delay-- and try to call it like a function. Of course that's an error.

For entertainment (and slight educational) purposes only, you can pass in a function that reverses the arguments and it will work:

let util = require('util')

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

Now the final argument of the function you passed to promisify expects function. But the asyn/await method is so much nicer…

like image 142
Mark Avatar answered Dec 04 '22 10:12

Mark