Javascript 与x27之间的差异;实用程序promisify(设置超时)和#x27;和';ms=>;新承诺(解析=>;设置超时(解析,毫秒))&x27;
环境:节点8.11.x 我想使用async/await睡眠一会儿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”参数必须是函数。 文档说明:此方法有一个用于承诺的自定义变量,可
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(不管是什么)