最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

異步編程解決方案

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

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

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

promisify

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

基本使用

以一個(gè)簡(jiǎn)單的讀寫(xiě)文件的fs.readFilereadFileSync為例說(shuō)明。我們知道fs.readFile是通過(guò)回調(diào)函數(shù)的方式來(lái)獲取讀到的文件內(nèi)容。而fs.readFileSync是通過(guò)同步的方式讀取到文件內(nèi)容。我們就可以使用promisify這個(gè)函數(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());
// 通過(guò)回調(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())
  })

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

自己實(shí)現(xiàn)一個(gè)promisify

我們?cè)谶@里也自己實(shí)現(xiàn)一個(gè)promisify函數(shù),達(dá)到上面的效果。即將一個(gè)接受回調(diào)函數(shù)通過(guò)回調(diào)完成異步編程的方式改為promise的方式

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

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

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

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

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

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é)

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

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

相關(guān)文章

  • NodeJs模擬登陸正方教務(wù)

    NodeJs模擬登陸正方教務(wù)

    網(wǎng)上已經(jīng)有很多關(guān)于模擬登陸正方教務(wù)的作品了,基于 PHP,Python,Java,.Net 加上NodeJs,這幾門(mén)語(yǔ)言都可以實(shí)現(xiàn)模擬登陸,模擬登陸的技術(shù)點(diǎn)不是特別難,這里記錄一下利用Node碰到的一些坑,以及一些解決思路。
    2017-04-04
  • node.js讀取Excel數(shù)據(jù)(下載圖片)的方法示例

    node.js讀取Excel數(shù)據(jù)(下載圖片)的方法示例

    這篇文章主要給大家介紹了關(guān)于node.js讀取Excel數(shù)據(jù)(下載圖片)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用node.js具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-08-08
  • node.js降低版本的方式詳解(解決sass和node.js沖突問(wèn)題)

    node.js降低版本的方式詳解(解決sass和node.js沖突問(wèn)題)

    這篇文章主要介紹了node.js降低版本的方式(解決sass和node.js沖突),本文是因?yàn)閟ass版本和node版本不匹配(可以找一下對(duì)應(yīng)的版本),本文給大家詳細(xì)講解,需要的朋友可以參考下
    2023-02-02
  • Mac 安裝 nodejs方法(圖文詳細(xì)步驟)

    Mac 安裝 nodejs方法(圖文詳細(xì)步驟)

    這篇文章主要介紹了Mac 安裝 nodejs方法(圖文詳細(xì)步驟),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-10-10
  • 使用Nodejs獲取bing每日?qǐng)D片

    使用Nodejs獲取bing每日?qǐng)D片

    這篇文章主要為大家詳細(xì)介紹了如何使用Nodejs獲取bing每日?qǐng)D片,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,有興趣的小伙伴可以學(xué)習(xí)一下
    2023-12-12
  • 如何在node的express中使用socket.io

    如何在node的express中使用socket.io

    這篇文章主要介紹了如何在node的express中使用socket.io,需要的朋友可以參考下
    2014-12-12
  • nodejs dgram模塊廣播+組播的實(shí)現(xiàn)示例

    nodejs dgram模塊廣播+組播的實(shí)現(xiàn)示例

    這篇文章主要介紹了nodejs dgram模塊廣播+組播的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11
  • 淺析Node.js實(shí)用的內(nèi)置API

    淺析Node.js實(shí)用的內(nèi)置API

    這篇文章主要介紹了Node.js實(shí)用的內(nèi)置API,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-06-06
  • node.js正則表達(dá)式獲取網(wǎng)頁(yè)中所有鏈接的代碼實(shí)例

    node.js正則表達(dá)式獲取網(wǎng)頁(yè)中所有鏈接的代碼實(shí)例

    這篇文章主要介紹了node.js正則表達(dá)式獲取網(wǎng)頁(yè)中所有鏈接的代碼實(shí)例,使用正則表達(dá)式實(shí)現(xiàn),需要的朋友可以參考下
    2014-06-06
  • node.js?express和koa中間件機(jī)制和錯(cuò)誤處理機(jī)制

    node.js?express和koa中間件機(jī)制和錯(cuò)誤處理機(jī)制

    這篇文章主要介紹了node.js?express和koa中間件機(jī)制和錯(cuò)誤處理機(jī)制,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的朋友可以參考一下
    2022-07-07

最新評(píng)論

衡南县| 株洲市| 赤峰市| 三原县| 安仁县| 绥中县| 鄂伦春自治旗| 滁州市| 英吉沙县| 龙陵县| 阿瓦提县| 花垣县| 襄樊市| 盈江县| 桂东县| 雷州市| 舞阳县| 南澳县| 金寨县| 霞浦县| 手机| 松潘县| 株洲县| 和顺县| 惠州市| 文化| 顺昌县| 临汾市| 美姑县| 隆化县| 桐柏县| 颍上县| 尼勒克县| 泰兴市| 行唐县| 那坡县| 波密县| 齐齐哈尔市| 仲巴县| 岳西县| 梅州市|