Promise 化回调式函数
Node.js 8 提供了新的工具函數(shù):util.promisify,用于把形如?(err, value) => ...?的回調(diào)式函數(shù)轉(zhuǎn)換為 Promise 版本。
基本使用
const util = require('util'); const fs = require('fs');const stat = util.promisify(fs.stat);stat('.').then((stats) => {// Do something with `stats` }).catch((error) => {// Handle the error. }); 復(fù)制代碼當(dāng)然,也可以使用 Node 8 另一個新功能?async function?調(diào)用:
const util = require('util'); const fs = require('fs');const stat = util.promisify(fs.stat);async function callStat() {const stats = await stat('.');console.log(`This directory is owned by ${stats.uid}`); } 復(fù)制代碼自定義函數(shù)的 Promise 版本
通過設(shè)置?util.promisify.custom?symbol,可以自定義?util.promisify()?的返回值:
const util = require('util');function doSomething(foo, callback) {// ... }doSomething[util.promisify.custom] = (foo) => {return getPromiseSomehow(); };const promisified = util.promisify(doSomething);console.log(promisified === doSomething[util.promisify.custom]); // prints 'true' 復(fù)制代碼自定義 Promise symbol 一般用于源函數(shù)不遵循?(err, value) => ...?回調(diào)的場景,比如?(foo, onSuccessCallback, onErrorCallback)?式回調(diào)的函數(shù):
doSomething[util.promisify.custom] = (foo) => {return new Promise((resolve, reject) => {doSomething(foo, resolve, reject);}); }; 復(fù)制代碼回調(diào)函數(shù)中包含超過兩個參數(shù)的函數(shù)
諸如以下函數(shù),回調(diào)中除了?err?參數(shù),還包含多個參數(shù):
- child_process.exec
- child_process.execFile
- dns.lookup
- dns.lookupService
- fs.read
- fs.write
經(jīng)過?util.promisify?處理的 Promise 版本會將多個參數(shù)組裝成對象返回。
例如,dns.lookup()?的回調(diào)有三個參數(shù):
- err: Error
- address: 字符串
- family: 整數(shù)
Promise 化后,返回?{address: '', family: 3}?這樣的對象:
const util = require('util'); const dns = require('dns'); const lookupAsync = util.promisify(dns.lookup);lookupAsync('nodejs.org').then(obj => console.log(obj));// { address: '104.20.23.46', family: 4 } 復(fù)制代碼老版本 Node
Polyfill: util.promisify 模塊
npm install util.promisify 復(fù)制代碼 const util = require('util'); require('util.promisify').shim();const fs = require('fs'); const readFileAsync = util.promisify(fs.readFile); 復(fù)制代碼pify
pify?是一個小而美的 Promise 化工具,處理了一些有用的細(xì)節(jié),如自動?this?綁定,這是內(nèi)置的?util.promisify?中沒有的。
const fs = require('fs'); const pify = require('pify');// Promisify a single function pify(fs.readFile)('package.json', 'utf8').then(data => {console.log(JSON.parse(data).name);//=> 'pify' });// Promisify all methods in a module pify(fs).readFile('package.json', 'utf8').then(data => {console.log(JSON.parse(data).name);//=> 'pify' }); 復(fù)制代碼參考鏈接
- Node.js 8: util.promisify()
- util.promisify(original)?Node.js 官方文檔
原文發(fā)布時間為:2018年07月02日
作者:掘金
本文來源:掘金?如需轉(zhuǎn)載請聯(lián)系原作者
總結(jié)
以上是生活随笔為你收集整理的Promise 化回调式函数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 页面中如何引用外部的HTML(四种方法)
- 下一篇: python_ re模块学习