Skip to content

Commit

Permalink
feat(Ch4): util.promisifyと.promisesについてを追加 (#337)
Browse files Browse the repository at this point in the history
* feat(Ch4): util.promisifyと.promisesについてを追加

* use assert

* fix
  • Loading branch information
azu authored Oct 12, 2019
1 parent e610c89 commit ae5f7e7
Show file tree
Hide file tree
Showing 2 changed files with 13 additions and 9 deletions.
19 changes: 12 additions & 7 deletions Ch4_AdvancedPromises/promise-chain.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -184,14 +184,18 @@ JavaScriptでは動的にメソッドを定義することもできるため、
そのような仕組みは<<es-promises,ES Promises>>にはありませんが、
著名なサードパーティのPromise実装である https://github.com/petkaantonov/bluebird/[bluebird] などには
https://github.com/petkaantonov/bluebird/blob/master/API.md#promisification[Promisification] という機能が用意されています。
また、Node.jsのコアモジュールである``util``モジュールには、 https://nodejs.org/api/util.html#util_util_promisify_original[util.promisify] というAPIが用意されています。

これを利用すると以下のように、その場でpromise版のメソッドを追加して利用できるようになります
これを利用すると以下のように、その場でPromise版のメソッドを作成して利用できるようになります

[source,javascript]
----
const fs = Promise.promisifyAll(require("fs"));
const fs = require("fs");
const util = require("util");
// コールバック版のAPIからPromise版を作成する
const readFile = util.promisify(fs.readFile);
fs.readFileAsync("myfile.js", "utf8").then((contents) => {
readFile("myfile.js", "utf8").then((contents) => {
console.log(contents);
}).catch((e) => {
console.error(e.stack);
Expand All @@ -200,7 +204,7 @@ fs.readFileAsync("myfile.js", "utf8").then((contents) => {

==== ArrayのPromiseラッパー

先ほどの https://github.com/petkaantonov/bluebird/blob/master/API.md#promisification[Promisification] が何をやっているのか少しイメージしにくいので、
先ほどの``util.promisify``が何をやっているのか少しイメージしにくいので、
次のようなネイティブ `Array` のPromise版となるメソッドを動的に定義する例を考えてみましょう。

JavaScriptにはネイティブにもDOMやString等メソッドチェーンが行える機能が多くあります。
Expand Down Expand Up @@ -234,9 +238,10 @@ include::test/array-promise-chain-test.js[]

[NOTE]
====
先ほどの https://github.com/petkaantonov/bluebird/blob/master/API.md#promisification[Promisification] は
Node.jsのCoreモジュールの非同期処理には `function(error,result){}` というように第一引数に `error` が来るというルールを利用して、
自動的にPromiseでラップしたメソッドを生成しています
先ほどの https://nodejs.org/api/util.html#util_util_promisify_original[util.promisify] は、
Node.jsのCoreモジュールの非同期処理には `function(error, result){}` というように第一引数に `error` が来るというルール(エラーファーストコールバック)を利用して、自動的にPromiseでラップしたメソッドを生成しています。
また、Node.js 10からは ``fs`` モジュールに https://nodejs.org/api/fs.html#fs_fs_promises_api[Promise版のAPI] が追加されています。
====

=== まとめ
Expand Down
3 changes: 1 addition & 2 deletions Ch4_AdvancedPromises/test/array-promise-chain-test.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
"use strict";
const assert = require("power-assert");
const assert = require("assert");
const ArrayAsPromise = require("../src/promise-chain/array-promise-chain");
describe("array-promise-chain", () => {
function isEven(value) {
Expand Down

0 comments on commit ae5f7e7

Please sign in to comment.