亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Node.js 8 中的 util.promisify的詳解

 更新時間:2017年06月12日 10:53:27   作者:Meathill  
本篇文章主要介紹了Node.js 8 中的 util.promisify的詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

Node.js 8 于上個月月底正式發(fā)布,帶來了 很多新特性 。其中比較值得注意的,便有 util.promisify() 這個方法。

util.promisify()

雖然 Promise 已經(jīng)普及,但是 Node.js 里仍然有大量的依賴回調(diào)的異步函數(shù),如果我們每個函數(shù)都封裝一次,也是齁麻煩齁麻煩的,比齁還麻煩。

所以 Node8 就提供了 util.promisify() 這個方法,方便我們快捷的把原來的異步回調(diào)方法改成返回 Promise 實例的方法,接下來,想繼續(xù)用隊列,還是 await 就看需要了。

我們看下范例:

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.
 });

怎么樣,很簡單吧?按照文檔中的說法,只要符合 Node.js 的回調(diào)風格,所有函數(shù)都可以這樣轉(zhuǎn)換。也就是說,滿足下面兩個條件即可。

  1. 最后一個參數(shù)是函數(shù)
  2. 回調(diào)函數(shù)的參數(shù)為 (err, result),前面是可能的錯誤,后面是正常的結(jié)果

結(jié)合 Await/Async 使用

同樣是上面的例子,如果想要結(jié)合 Await/Async,可以這樣使用:

const util = require('util');
const fs = require('fs');

const stat = util.promisify(fs.stat);
async function readStats(dir) {
 try {
  let stats = await stat(dir);
  // Do something with `stats`
 } catch (err) { // Handle the error.
  console.log(err);
 }
}
readStats('.');

自定義 Promise 化處理函數(shù)

那如果函數(shù)不符合這個風格,還能用 util.promisify() 么?答案也是肯定的。我們只要給函數(shù)增加一個屬性,util.promisify.custom ,指定一個函數(shù)作為 Promise 化處理函數(shù),即可。請看下面的代碼:

const util = require('util');

function doSomething(foo, callback) {
 // ...
}

doSomething[util.promisify.custom] = function(foo) {
 return getPromiseSomehow();
};

const promisified = util.promisify(doSomething);
console.log(promisified === doSomething[util.promisify.custom]);
// prints 'true'

如此一來,任何時候我們對目標函數(shù) doSomething 進行 Promise 化處理,都會得到之前定義的函數(shù)。運行它,就會按照我們設(shè)計的特定邏輯返回 Promise 實例。

我們就可以升級以前所有的異步回調(diào)函數(shù)了。

Promise 介紹

因為種種歷史原因,JS 當中有大量異步函數(shù)。這些異步函數(shù),大多要依賴回調(diào)進行處理(這里我覺得把事件偵聽算作回調(diào)也是合理的),但是回調(diào)嵌套層次一多,就會形成所謂的“回調(diào)陷阱”,讓開發(fā)者苦不堪言。

為了解決這個問題,開發(fā)社區(qū)經(jīng)過摸索,總結(jié)出來一套名為 Promise/A+ 的解決方案。大體上來說,這套方案通過使用 “Promise 回調(diào)實例”包裹原先的回調(diào)函數(shù),可以將原先復雜的嵌套展開、鋪平,從而降低開發(fā)和維護的難度和成本。

new Promise( (resolve, reject) => { // 構(gòu)建一個 Promise 實例
 someAsyncFunction( (err, result) => { // 調(diào)用原來的異步函數(shù)
  if (err) { // 發(fā)生錯誤,進入錯誤處理模式
   return reject(err);
  }
  resolve(result); // 一切正常,進入隊列的下一環(huán)節(jié)
 });
})
 .then( result => { // 下一環(huán)節(jié)
  return doSomething(result);
 })
 .then( result2 => { // 又下一環(huán)節(jié)
  return doSomething2(result2);
 })
 ... // 各種中間環(huán)節(jié)
 .catch( err => { // 錯誤處理
  console.log(err);
 });

ES2015(ES6)里包含了 Promise 標準,如今已經(jīng)在大部分運行時里實裝,我們可以放心大膽的使用它。而且,由于 Promise 不需要新的語法元素,所以即使在不支持原生 Promise 的環(huán)境里也可以使用類庫,比如 Q 或者 Bluebird ,甚至 jQuery 。

在小程序里也有效喲。

ES2017 增加了 Await/Async 語法,但請注意, Await 后面必須跟 Promise 實例才能實現(xiàn)異步。所以,大家還是把 Promise 的概念學好吧!

function resolveAfter2Seconds(x) {
 return new Promise(resolve => {
  setTimeout(() => {
   resolve(x);
  }, 2000);
 });
}

async function f1() {
 var x = await resolveAfter2Seconds(10);
 console.log(x); // 10
}
f1();

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 深入了解 Node的多進程服務實現(xiàn)

    深入了解 Node的多進程服務實現(xiàn)

    本文主要介紹了Node的多進程服務實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-06-06
  • 淺談NodeJs之數(shù)據(jù)庫異常處理

    淺談NodeJs之數(shù)據(jù)庫異常處理

    這篇文章主要介紹了淺談NodeJs之數(shù)據(jù)庫異常處理,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-10-10
  • 如何發(fā)布一個npm包到?Nexus私有倉庫

    如何發(fā)布一個npm包到?Nexus私有倉庫

    這篇文章主要介紹了如何發(fā)布一個npm包到?Nexus私有倉庫,通過實例代碼介紹了如何添加nexus權(quán)限及配置?npm?私庫免登錄設(shè)置的相關(guān)知識,感興趣的朋友跟隨小編一起看看吧
    2024-03-03
  • NVM切換不同版本node的實現(xiàn)步驟

    NVM切換不同版本node的實現(xiàn)步驟

    nvm是Node.js的版本管理器,可以讓我們輕松地在不同的Node.js版本之間進行切換,本文就來介紹一下NVM切換不同版本node的實現(xiàn)步驟,感興趣的可以了解一下
    2023-12-12
  • node.js中的fs.fsync方法使用說明

    node.js中的fs.fsync方法使用說明

    這篇文章主要介紹了node.js中的fs.fsync方法使用說明,本文介紹了fs.fsync的方法說明、語法、接收參數(shù)、使用實例和實現(xiàn)源碼,需要的朋友可以參考下
    2014-12-12
  • 如何利用Node.js做簡單的圖片爬取

    如何利用Node.js做簡單的圖片爬取

    這篇文章主要介紹了如何利用Node.js做簡單的圖片爬取,爬蟲的主要目的是收集互聯(lián)網(wǎng)上公開的一些特定數(shù)據(jù),本文介紹用于網(wǎng)絡(luò)抓取的node.js包,完成一個簡單的爬蟲案例來爬取網(wǎng)頁上圖片并下載到本地
    2022-06-06
  • 詳解nodejs微信公眾號開發(fā)——5.素材管理接口

    詳解nodejs微信公眾號開發(fā)——5.素材管理接口

    這篇文章主要介紹了詳解nodejs微信公眾號開發(fā)——5.素材管理接口,非常具有實用價值,需要的朋友可以參考下
    2017-04-04
  • Node.js中同步和異步編程的區(qū)別及使用方法

    Node.js中同步和異步編程的區(qū)別及使用方法

    在Node.js中,同步和異步編程是兩種不同的處理方式。同步方式會阻塞程序的執(zhí)行,而異步方式則不會。通過掌握它們的區(qū)別和使用方法,可以更好地實現(xiàn)程序的性能優(yōu)化和功能擴展。同時,需要注意異步編程中的回調(diào)地獄問題,使用Promise可以更好地處理異步編程
    2023-05-05
  • Windows下Node.js安裝及環(huán)境配置方法

    Windows下Node.js安裝及環(huán)境配置方法

    這篇文章主要為大家介紹一下Node.js安裝及環(huán)境配置方法,這也是腳本之家小編發(fā)現(xiàn)的比較詳細的教程了,從安裝到配置都很詳細,想學習Node.js的朋友可以參考一下
    2017-09-09
  • nodejs dgram模塊廣播+組播的實現(xiàn)示例

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

    這篇文章主要介紹了nodejs dgram模塊廣播+組播的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-11-11

最新評論