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

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

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

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

util.promisify()

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

所以 Node8 就提供了 util.promisify() 這個(gè)方法,方便我們快捷的把原來(lái)的異步回調(diào)方法改成返回 Promise 實(shí)例的方法,接下來(lái),想繼續(xù)用隊(duì)列,還是 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.
 });

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

  1. 最后一個(gè)參數(shù)是函數(shù)
  2. 回調(diào)函數(shù)的參數(shù)為 (err, result),前面是可能的錯(cuò)誤,后面是正常的結(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ù)不符合這個(gè)風(fēng)格,還能用 util.promisify() 么?答案也是肯定的。我們只要給函數(shù)增加一個(gè)屬性,util.promisify.custom ,指定一個(gè)函數(shù)作為 Promise 化處理函數(shù),即可。請(qǐng)看下面的代碼:

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'

如此一來(lái),任何時(shí)候我們對(duì)目標(biāo)函數(shù) doSomething 進(jìn)行 Promise 化處理,都會(huì)得到之前定義的函數(shù)。運(yùn)行它,就會(huì)按照我們?cè)O(shè)計(jì)的特定邏輯返回 Promise 實(shí)例。

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

Promise 介紹

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

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

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

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

在小程序里也有效喲。

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

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

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

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 詳解nodejs異步I/O和事件循環(huán)

    詳解nodejs異步I/O和事件循環(huán)

    本篇文章主要介紹了nodejs異步I/O和事件循環(huán),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-06-06
  • npm設(shè)置同時(shí)從多個(gè)包源加載包的方法

    npm設(shè)置同時(shí)從多個(gè)包源加載包的方法

    本文主要介紹了npm 設(shè)置同時(shí)從多個(gè)包源加載包的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • Node使用Nodemailer發(fā)送郵件的方法實(shí)現(xiàn)

    Node使用Nodemailer發(fā)送郵件的方法實(shí)現(xiàn)

    這篇文章主要介紹了Node使用Nodemailer發(fā)送郵件的方法實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • nodejs實(shí)現(xiàn)用戶(hù)登錄路由功能

    nodejs實(shí)現(xiàn)用戶(hù)登錄路由功能

    這篇文章主要介紹了nodejs中實(shí)現(xiàn)用戶(hù)登錄路由功能,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-05-05
  • node.js中的buffer.slice方法使用說(shuō)明

    node.js中的buffer.slice方法使用說(shuō)明

    這篇文章主要介紹了node.js中的buffer.slice方法使用說(shuō)明,本文介紹了buffer.slice的方法說(shuō)明、語(yǔ)法、接收參數(shù)、使用實(shí)例和實(shí)現(xiàn)源碼,需要的朋友可以參考下
    2014-12-12
  • nodejs處理http請(qǐng)求實(shí)例詳解之get和post

    nodejs處理http請(qǐng)求實(shí)例詳解之get和post

    最近一段時(shí)間在學(xué)習(xí)前端向服務(wù)器發(fā)送數(shù)據(jù)和請(qǐng)求數(shù)據(jù),下面這篇文章主要給大家介紹了關(guān)于nodejs處理http請(qǐng)求實(shí)例詳解之get和post的相關(guān)資料,需要的朋友可以參考下
    2023-01-01
  • 使用koa2創(chuàng)建web項(xiàng)目的方法步驟

    使用koa2創(chuàng)建web項(xiàng)目的方法步驟

    這篇文章主要介紹了使用koa2創(chuàng)建web項(xiàng)目的方法步驟,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2019-03-03
  • 從reflect?metadata理解Nest實(shí)現(xiàn)原理

    從reflect?metadata理解Nest實(shí)現(xiàn)原理

    這篇文章主要為大家介紹了從reflect?metadata理解Nest實(shí)現(xiàn)原理示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • Nodejs中JSON和YAML互相轉(zhuǎn)換方式

    Nodejs中JSON和YAML互相轉(zhuǎn)換方式

    這篇文章主要介紹了Nodejs中JSON和YAML互相轉(zhuǎn)換方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-03-03
  • Nodejs使用fs-extra模塊進(jìn)行目錄和文件操作用法示例

    Nodejs使用fs-extra模塊進(jìn)行目錄和文件操作用法示例

    fs-extra模塊是基于fs?的文件操作相關(guān)工具庫(kù),封裝了一些fs實(shí)現(xiàn)起來(lái)相對(duì)復(fù)雜的工具,下面這篇文章主要給大家介紹了關(guān)于Nodejs使用fs-extra模塊進(jìn)行目錄和文件操作用法的相關(guān)資料,需要的朋友可以參考下
    2024-06-06

最新評(píng)論

剑河县| 宁化县| 宜黄县| 吉林市| 滦平县| 四平市| 长沙县| 彭水| 长垣县| 正定县| 梁平县| 班玛县| 大悟县| 镇平县| 周口市| 志丹县| 外汇| 上林县| 丰镇市| 长武县| 扶沟县| 博客| 金乡县| 嵊泗县| 古丈县| 砚山县| 都昌县| 宁化县| 长葛市| 辽宁省| 新郑市| 镇巴县| 西藏| 茌平县| 谢通门县| 永和县| 广德县| 望奎县| 明水县| 屯门区| 襄垣县|