成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

[譯] Node.js 8: util.promisify()

Shimmer / 3017人閱讀

摘要:例如,的回調(diào)函數(shù)包含下面幾個(gè)參數(shù)轉(zhuǎn)換成之后,它的參數(shù)將會(huì)變成這樣一個(gè)對(duì)象通過(guò)內(nèi)部符號(hào)處理非標(biāo)準(zhǔn)回調(diào)函數(shù)。

Nodejs 8 有一個(gè)新的工具函數(shù) util.promisify()。他將一個(gè)接收回調(diào)函數(shù)參數(shù)的函數(shù)轉(zhuǎn)換成一個(gè)返回Promise的函數(shù)。

1、util.promisify()小例子

如果你給以下命令傳入文件路徑,則會(huì)輸出文件內(nèi)容

// echo.js

const {promisify} = require("util");

const fs = require("fs");
const readFileAsync = promisify(fs.readFile); // (A)

const filePath = process.argv[2];

readFileAsync(filePath, {encoding: "utf8"})
  .then((text) => {
      console.log("CONTENT:", text);
  })
  .catch((err) => {
      console.log("ERROR:", err);
  });

注意:在第一行,程序使用promisify()轉(zhuǎn)換基于回調(diào)函數(shù)的方法fs.readFile()成一個(gè)返回promise的一個(gè)函數(shù)

下面的代碼片段顯示這個(gè)腳本如何使用的

$ node echo.js echo.js
CONTENT: const {promisify} = require("util");
···

$ node echo.js unknown.txt
ERROR: { Error: ENOENT: no such file or directory, ··· }
2、使用async函數(shù)

同樣的功能,但是通過(guò)async函數(shù)實(shí)現(xiàn)

// echoa.js

const {promisify} = require("util");

const fs = require("fs");
const readFileAsync = promisify(fs.readFile);

const filePath = process.argv[2];

async function main() {
    try {
        const text = await readFileAsync(filePath, {encoding: "utf8"});
        console.log("CONTENT:", text);
    }
    catch (err) {
        console.log("ERROR:", err);
    }
}
main();
3、轉(zhuǎn)換有多個(gè)參數(shù)的回調(diào)函數(shù)為Promise

下面的函數(shù)的回調(diào)函數(shù)接收多于一個(gè)的參數(shù)(除了error參數(shù))

child_process.exec

child_process.execFile

dns.lookup

dns.lookupService

fs.read

fs.write

如果你轉(zhuǎn)換這些函數(shù)為promise,它會(huì)返回一個(gè)對(duì)象(由多個(gè)參數(shù)組成的對(duì)象,而不是一個(gè)值)。例如,dns.lookup的回調(diào)函數(shù)包含下面幾個(gè)參數(shù)

err : Error

address : string

family : integer

轉(zhuǎn)換成Promise之后,它的參數(shù)將會(huì)變成{address, family}這樣一個(gè)對(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 }

promisify()通過(guò)內(nèi)部符號(hào)internal/util/customPromisifyArgs處理非標(biāo)準(zhǔn)回調(diào)函數(shù)。因此不推薦傳入一個(gè)非標(biāo)準(zhǔn)的回調(diào)函數(shù),也不應(yīng)該去轉(zhuǎn)換我們自己實(shí)現(xiàn)的回調(diào)(ps:自己就直接寫Promise就好了。。。)

4、定制的Promise函數(shù)

promisified的API來(lái)源于util.promisify.custom,它允許您將一個(gè)promisified版本附加到一個(gè)基于回調(diào)的函數(shù)。 在以下示例中,fooAsyncfoopromisified版本

const util = require("util");

function foo() {
    return "abc";
}
async function fooAsync() {
    return "abc";
}
foo[util.promisify.custom] = fooAsync;

console.log(util.promisify(foo) === fooAsync); // true
4.1 定制了promisified版本的標(biāo)準(zhǔn)函數(shù)

現(xiàn)在,有兩個(gè)標(biāo)準(zhǔn)函數(shù)有定制的promisified版本

> setImmediate[util.promisify.custom]
[Function]
> setTimeout[util.promisify.custom]
[Function]
5、低版本node兼容庫(kù)

Jordan Harband寫了一個(gè)庫(kù)a polyfill for util.promisify(),用來(lái)兼容promisify,使用方法如下

需要注意:

js必須支持es5以上語(yǔ)法

必須支持Promise

待完善中

安裝

npm install util.promisify

使用方式有兩種

第一種,檢查是否有內(nèi)置實(shí)現(xiàn)(Node 8)或者使用 polyfill (舊的Node版本)

const promisify = require("util.promisify");

const fs = require("fs");
const readFileAsync = promisify(fs.readFile);

第二種,在舊版本的Node上使用補(bǔ)丁模塊

const util = require("util");
require("util.promisify").shim();

const fs = require("fs");
const readFileAsync = util.promisify(fs.readFile);

翻譯自 Node.js 8: util.promisify()

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/87044.html

相關(guān)文章

  • Node.js 8 中的 `util.promisify`

    摘要:我們就可以升級(jí)以前所有的異步回調(diào)函數(shù)了。大體上來(lái)說(shuō),這套方案通過(guò)使用回調(diào)實(shí)例包裹原先的回調(diào)函數(shù),可以將原先復(fù)雜的嵌套展開鋪平,從而降低開發(fā)和維護(hù)的難度和成本。 Node.js 8 于上個(gè)月月底正式發(fā)布,帶來(lái)了很多新特性。其中比較值得注意的,便有 util.promisify() 這個(gè)方法。 如果你已經(jīng)很熟悉 Promise,請(qǐng)繼續(xù)往下看。如果你還不熟悉 Promise,可以先跳過(guò)去看下...

    HackerShell 評(píng)論0 收藏0
  • util.promisify 的那些事兒

    摘要:自定義的化有那么一些場(chǎng)景,是不能夠直接使用來(lái)進(jìn)行轉(zhuǎn)換的,有大概這么兩種情況沒(méi)有遵循約定的回調(diào)函數(shù)返回多個(gè)參數(shù)的回調(diào)函數(shù)首先是第一個(gè),如果沒(méi)有遵循我們的約定,很可能導(dǎo)致的誤判,得不到正確的反饋。 util.promisify是在node.js 8.x版本中新增的一個(gè)工具,用于將老式的Error first callback轉(zhuǎn)換為Promise對(duì)象,讓老項(xiàng)目改造變得更為輕松。 在官方推...

    shuibo 評(píng)論0 收藏0
  • Node.js 前端開發(fā)指南

    摘要:定時(shí)器在和瀏覽器中的表現(xiàn)形式是相同的。關(guān)于定時(shí)器的一個(gè)重要的事情是,我們提供的延遲不代表在這個(gè)時(shí)間之后回調(diào)就會(huì)被執(zhí)行。它的真正含義是,一旦主線程完成所有操作包括微任務(wù)并且沒(méi)有其它具有更高優(yōu)先級(jí)的定時(shí)器,將在此時(shí)間之后執(zhí)行回調(diào)。 眾成翻譯 原文鏈接 關(guān)于作者 2018年6月21日出版? 本指南面向了解Javascript但尚未十分熟悉Node.js的前端開發(fā)人員。我這里不專注于語(yǔ)言本身...

    CntChen 評(píng)論0 收藏0
  • Node】搭建一個(gè)靜態(tài)資源服務(wù)器

    摘要:一個(gè)包括文件緩存?zhèn)鬏攭嚎s模版引擎類型匹配等功能的靜態(tài)資源服務(wù)器,使用的內(nèi)置模塊實(shí)現(xiàn),可以通過(guò)鏈接訪問(wèn)資源。二使用讀取資源文件我們的目的是搭建一個(gè)靜態(tài)資源服務(wù)器,當(dāng)訪問(wèn)一個(gè)到資源文件或目錄時(shí),我們希望可以得到它。 一個(gè)包括文件緩存、傳輸壓縮、ejs 模版引擎、MIME 類型匹配等功能的 Node 靜態(tài)資源服務(wù)器,使用 Node 的內(nèi)置模塊實(shí)現(xiàn),可以通過(guò)鏈接訪問(wèn)資源。 一、創(chuàng)建 HTTP Se...

    Mr_houzi 評(píng)論0 收藏0
  • 現(xiàn)代JS中的流程控制:詳解Callbacks 、Promises 、Async/Await

    摘要:控制臺(tái)將顯示回調(diào)地獄通常,回調(diào)只能由一個(gè)異步函數(shù)調(diào)用。更多資源使更友好規(guī)范使用異步函數(shù)簡(jiǎn)化異步編碼旅程異步編程是一項(xiàng)在中無(wú)法避免的挑戰(zhàn)。 JavaScript經(jīng)常聲稱是_異步_。那是什么意思?它如何影響發(fā)展?近年來(lái)這種方法有何變化? 請(qǐng)思考以下代碼: result1 = doSomething1(); result2 = doSomething2(result1); 大多數(shù)語(yǔ)言都處理每...

    shadowbook 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<