日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

Promise 化回调式函数

發(fā)布時(shí)間:2025/7/14 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Promise 化回调式函数 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
【RTC實(shí)時(shí)互聯(lián)網(wǎng)大會(huì) 限時(shí)免費(fèi) 馬上報(bào)名】www.bagevent.com

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 另一個(gè)新功能?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)的場(chǎng)景,比如?(foo, onSuccessCallback, onErrorCallback)?式回調(diào)的函數(shù):

doSomething[util.promisify.custom] = (foo) => {return new Promise((resolve, reject) => {doSomething(foo, resolve, reject);}); }; 復(fù)制代碼

回調(diào)函數(shù)中包含超過兩個(gè)參數(shù)的函數(shù)

諸如以下函數(shù),回調(diào)中除了?err?參數(shù),還包含多個(gè)參數(shù):

  • child_process.exec
  • child_process.execFile
  • dns.lookup
  • dns.lookupService
  • fs.read
  • fs.write

經(jīng)過?util.promisify?處理的 Promise 版本會(huì)將多個(gè)參數(shù)組裝成對(duì)象返回。

例如,dns.lookup()?的回調(diào)有三個(gè)參數(shù):

  • err: Error
  • address: 字符串
  • family: 整數(shù)

Promise 化后,返回?{address: '', family: 3}?這樣的對(duì)象:

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?是一個(gè)小而美的 Promise 化工具,處理了一些有用的細(xì)節(jié),如自動(dòng)?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ā)布時(shí)間為:2018年07月02日
作者:掘金
本文來源:掘金?如需轉(zhuǎn)載請(qǐng)聯(lián)系原作者

總結(jié)

以上是生活随笔為你收集整理的Promise 化回调式函数的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。