当前位置: 首页 > 后端技术 > Node.js

[翻译]Node.js8-util.promisify()

时间:2023-04-03 14:19:34 Node.js

Nodejs8有一个新的实用函数util.promisify()。它将一个接受回调作为参数的函数转换为一个返回Promise的函数。1.util.promisify()的小例子如果你传入文件路径到下面的命令,文件内容将被输出//echo.jsconst{promisify}=require('util');constfs=require('fs');constreadFileAsync=promisify(fs.readFile);//(A)constfilePath=process.argv[2];readFileAsync(filePath,{encoding:'utf8'}).then((text)=>{console.log('CONTENT:',text);}).catch((err)=>{console.log('ERROR:',err);});注意:在第一行,程序使用promisify()将基于回调的函数转换为方法fs.readFile()成为返回承诺的函数。以下代码片段显示了此脚本如何使用$nodeecho.jsecho.jsCONTENT:const{promisify}=require('util');···$nodeecho.jsunknown.txtERROR:{Error:ENOENT:nosuchfileor目录,···}2.使用async函数实现同样的功能,不过是通过async函数//echoa.jsconst{promisify}=require('util');constfs=require('fs');constreadFileAsync=promisify(fs.readFile);const文件路径=进程。argv[2];asyncfunctionmain(){try{consttext=awaitreadFileAsync(filePath,{encoding:'utf8'});console.log('内容:',文本);}catch(err){console.log('错误:',错误);}}主要();3。将多参数的回调函数转换为Promise下面的函数。回调函数接收多个参数(错误参数除外)child_process.execchild_process.execFiledns.lookupdns.lookupServicefs.readfs.write如果将这些函数转换为promise,它会返回一个对象(由多个参数组成的对象,不是一个价值)。例如dns.lookup的回调函数中包含如下参数err:Erroraddress:stringfamily:integer转Promise后,其参数会变成一个对象,如{address,family}constutil=require('util');constdns=要求('dns');constlookupAsync=util。promisify(dns.lookup);lookupAsync('nodejs.org').then(obj=>console.log(obj));//{address:'104.20.23.46',family:4}promisify()通过内部符号internal/util/customPromisifyArgs处理非标准回调函数。所以不建议传入非标准的回调函数,也不要自己转换回调(ps:直接写Promise就可以了。。。)4、自定义Promise函数promisified的API来自于util。promisify.custom,它允许您将promisified版本附加到基于回调的函数。在以下示例中,fooAsync是fooconstutil=require('util');functionfoo(){return'abc';}asyncfunctionfooAsync(){return'abc';}foo[util.promisify.自定义]=fooAsync;console.log(util.promisify(foo)===fooAsync);//true4.1标准函数的自定义promisified版本现在,有两个带有自定义promisified版本的标准函数>setImmediate[util.promisify.custom][Function]>setTimeout[util.promisify.custom][Function]5.低版本节点兼容库JordanHarband为util.promisify()编写了一个polyfill以兼容promisify。使用方法如下:注意:js必须支持es5以上语法必须支持Promise待完善安装npminstallutil.promisify有两种使用方式第一种,查看是否有内置实现(Node8)或使用polyfill(旧节点版本)constpromisify=require('util.promisify');constfs=require('fs');constreadFileAsync=promisify(fs.readFile);其次,在旧版本的Node上使用补丁模块(fs.readFile);翻译自Node.js8:util.promisify()