欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Node中的util.promisify()方法的基本使用和實現(xiàn)

 更新時間:2023年07月17日 09:56:28   作者:爆燃的小牛  
眾所周知,在JS中實現(xiàn)異步編程主要是通過以下幾種方案,回調(diào)函數(shù),觀察者模式,Generator,Promise,async / await ,今天就和大家一起聊一下在node中的一個util.promisify()這個API的基本使用和基本實現(xiàn)

異步編程解決方案

我們知道,在JS中實現(xiàn)異步編程主要是通過以下幾種方案:

  • 回調(diào)函數(shù):也是在ES6之前用的最多的方式,缺點是容易造成callback hell,可讀性很差
  • 觀察者模式:在NodeJS中的很多模塊都繼承了EventEmitter模塊, NodeJS 所有的異步 I/O 操作在完成時都會發(fā)送一個事件到事件隊列。所有這些產(chǎn)生事件的對象都是 events.EventEmitter 的實例。
  • Generator:ES6 新引入了 Generator 函數(shù),可以通過 yield 關(guān)鍵字,把函數(shù)的執(zhí)行流掛起,為改變執(zhí)行流程提供了可能,從而為異步編程提供解決方案。
  • Promise方案:號稱是異步編程的終極解決方案
  • async / await async是ES7引入的語法 ,也是屬于Promise方案中的一種

今天就聊一下在node中的一個util.promisify()這個API的基本使用和基本實現(xiàn)。

promisify

promisify這個方法可以是一個高階函數(shù),接受一個函數(shù)作為入?yún)?,可以將原本考回調(diào)函數(shù)實現(xiàn)的異步編程轉(zhuǎn)化為promis的方案。這也是node提供出來,可以將之前非promise的方法通過這個api轉(zhuǎn)化成promise來處理

基本使用

以一個簡單的讀寫文件的fs.readFilereadFileSync為例說明。我們知道fs.readFile是通過回調(diào)函數(shù)的方式來獲取讀到的文件內(nèi)容。而fs.readFileSync是通過同步的方式讀取到文件內(nèi)容。我們就可以使用promisify這個函數(shù),將fs.readFile轉(zhuǎn)變成promise的方式

// const.js 被讀取的文件
const str = 123
// index.js
const fs = require('fs')
const path = require('path')
const { promisify } = require('util')
// 同步的方式讀取const.js
const data = fs.readFileSync(path.resolve(__dirname,  './const.js'))
console.log('readFileSync:', data.toString());
// 通過回調(diào)函數(shù)的方式獲取const.js內(nèi)容
fs.readFile(path.resolve(__dirname, './const.js'), (error, data) => {
  if (error) console.log('error', error);
  console.log('readFile', data.toString());
})
// 將fs.readFile轉(zhuǎn)為promise的方式獲取文件內(nèi)容
const readFile = promisify(fs.readFile)
readFile(path.resolve(__dirname, './const.js'))
  .then(data => {
    console.log('promisify: ', data.toString())
  })

達到的效果也符合預(yù)期:

自己實現(xiàn)一個promisify

我們在這里也自己實現(xiàn)一個promisify函數(shù),達到上面的效果。即將一個接受回調(diào)函數(shù)通過回調(diào)完成異步編程的方式改為promise的方式

我們分析分析,思路其實很簡單, 原本的函數(shù)接受一系列的參數(shù),最后一個參數(shù)是一個回調(diào)函數(shù),一般在node中錯誤先行,最后一個參數(shù)即任務(wù)完成時的回調(diào)函數(shù)也接受兩個參數(shù)一個是error一個是處理后得到最后結(jié)果的data。如果有error的話就reject沒有就resolve返回promise結(jié)果即可,詳細分析步驟如下:

  • 我們實現(xiàn)的xpromisify是一個高階函數(shù),即接受一個函數(shù)作為參數(shù)
  • 接受的這個函數(shù)也有可能接受參數(shù),所以我們對這個函數(shù)進行升階處理,才能讓這個函數(shù)接受其他參數(shù)
  • 我們最后返回的一定是一個Promise實例
  • 我們可以將步驟2中這個函數(shù)接受的參數(shù)數(shù)組得到(比如上述例子中fs.readFile()函數(shù)接受的path.resolve(__dirname, './const.js')),再構(gòu)造一個函數(shù)作為回調(diào)函數(shù),作為完整的參數(shù),使用apply的方式讓在步驟一中接受的函數(shù)執(zhí)行
  • 構(gòu)造的回調(diào)函數(shù)中判斷步函數(shù)完成是否有錯誤,如果有錯誤我們reject掉,如果沒有錯誤的話就把這個dataresolve即可

完整的代碼實現(xiàn)如下所示:

// x-promisify.js
// xPromisify 是一個高階函數(shù),會將接受的fn函數(shù)轉(zhuǎn)為promise
const xPromisify = (fn) => {
  // 接受的fn函數(shù)也會接受其他參數(shù),所以升階處理,return 一個函數(shù)這樣就可以接受其他參數(shù)了
  return wrapFn = (...args) => {
    // 最終返回的肯定是一個promise實例
    return new Promise((resolve, reject) => {
        // 接受參數(shù)中加一個回調(diào)函數(shù)reject/resolve 最后結(jié)果
        args.push((error, data) => {
          if (error) reject(error)
          resolve(data)
        })
      // 此時args參數(shù)中就包含的fn執(zhí)行所需要的所有參數(shù)了
      fn.apply(null, args)
    })
  }
}
module.exports = {
  xPromisify
}

我們可以通過上述例子的fs.readFile這個函數(shù)來檢查一下:

const { xPromisify } = require('./x-promisify')
const xReadFile = xPromisify(fs.readFile);
xReadFile(path.resolve(__dirname, './const.js'))
  .then(data => {
    console.log('data', data.toString())
  })

執(zhí)行效果如下所示:

總結(jié)

其實我們做的事情只是將回調(diào)函數(shù)的邏輯做了修改,原本是直接在回調(diào)中處理業(yè)務(wù)邏輯,這里我們修改為在回調(diào)函數(shù)中把異步事件處理的結(jié)果通過reject / resove給返回出去 我們也可以看一下在NodeJS中對這一部分的實現(xiàn):

到此這篇關(guān)于Node中的的util.promisify()方法的基本使用和實現(xiàn)的文章就介紹到這了,更多相關(guān)Node 的util.promisify()方法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • koa-router路由參數(shù)和前端路由的結(jié)合詳解

    koa-router路由參數(shù)和前端路由的結(jié)合詳解

    這篇文章主要給大家介紹了關(guān)于koa-router路由參數(shù)和前端路由的結(jié)合的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家學(xué)習(xí)或者使用koa-router具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-05-05
  • 使用node.js實現(xiàn)微信小程序?qū)崟r聊天功能

    使用node.js實現(xiàn)微信小程序?qū)崟r聊天功能

    在微信這個聊天工具里的小程序上實現(xiàn)聊天功能,總覺得很詫異,今天小編給大家?guī)砹耸褂胣ode.js實現(xiàn)微信小程序?qū)崟r聊天功能,感興趣的朋友一起看看吧
    2018-08-08
  • nodejs如何在package.json中設(shè)置多條啟動命令

    nodejs如何在package.json中設(shè)置多條啟動命令

    這篇文章主要介紹了nodejs如何在package.json中設(shè)置多條啟動命令,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03
  • Node中的util.promisify()方法的基本使用和實現(xiàn)

    Node中的util.promisify()方法的基本使用和實現(xiàn)

    眾所周知,在JS中實現(xiàn)異步編程主要是通過以下幾種方案,回調(diào)函數(shù),觀察者模式,Generator,Promise,async / await ,今天就和大家一起聊一下在node中的一個util.promisify()這個API的基本使用和基本實現(xiàn)
    2023-07-07
  • Node.js 回調(diào)函數(shù)實例詳解

    Node.js 回調(diào)函數(shù)實例詳解

    這篇文章主要介紹了Node.js 回調(diào)函數(shù)實例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-07-07
  • Node.js中的cluster模塊深入解讀

    Node.js中的cluster模塊深入解讀

    NodeJS引入了Cluster模塊試圖簡化這些體力勞動,使用Cluster模塊可以運行并管理多個實例進程,下面這篇文章主要給大家介紹了關(guān)于Node.js中cluster模塊的相關(guān)資料,需要的朋友可以參考借鑒,下面來一起看看吧
    2018-06-06
  • Node.js 異步編程之 Callback介紹(一)

    Node.js 異步編程之 Callback介紹(一)

    這篇文章主要介紹了Node.js 異步編程之 Callback介紹(一),本文用實例講解Callback的相關(guān)知識,本文是第一篇,下一篇小編會跟進,需要的朋友可以參考下
    2015-03-03
  • 快速掌握Node.js事件驅(qū)動模型

    快速掌握Node.js事件驅(qū)動模型

    這篇文章主要為大家詳細介紹了Node.js事件驅(qū)動模型,首先了解一下傳統(tǒng)的線程網(wǎng)絡(luò)模型,然后再學(xué)習(xí)了解Node.js事件驅(qū)動模型,感興趣的小伙伴們可以參考一下
    2016-03-03
  • 在Node.js中設(shè)置響應(yīng)的MIME類型的代碼詳解

    在Node.js中設(shè)置響應(yīng)的MIME類型的代碼詳解

    在 Node.js 中設(shè)置響應(yīng)的 MIME 類型是為了讓瀏覽器正確解析服務(wù)器返回的內(nèi)容,比如 HTML、CSS、圖片、JSON 等,我們通常通過設(shè)置響應(yīng)頭中的 Content-Type 字段來完成,本文就給大家詳細介紹了在Node.js中設(shè)置響應(yīng)的MIME類型的方法,需要的朋友可以參考下
    2025-04-04
  • Node.js net模塊的使用示例

    Node.js net模塊的使用示例

    本文主要介紹了Node.js net模塊的使用示例,net模塊支持TCP通信,處理TCP連接和數(shù)據(jù)傳輸,具有一定的參考價值,感興趣的可以了解一下
    2025-02-02

最新評論