{
    "componentChunkName": "component---src-templates-blog-post-jsx",
    "path": "/post/benefits-of-node-bluebird/",
    "result": {"data":{"site":{"siteMetadata":{"title":"WEB EGG","author":"Leko - CTO at Yuimedi"}},"markdownRemark":{"id":"5ae14016-dad7-54dc-8e5a-8433344fbf87","excerpt":"こんにちは。 ES6のPromiseはBluebirdの４倍遅いらしいPromiseのライブラリBluebirdが提供するAPIのうち、個人的に便利だと思ったものについてまとめます。 なお、標準のPromiseにも搭載されている機能については割愛します。 Promise#finally Document .then…","html":"<p>こんにちは。</p>\n<p><a href=\"http://qiita.com/kuniken/items/d0583b31941f15a0ecb9\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">ES6のPromiseはBluebirdの４倍遅いらしい</a>PromiseのライブラリBluebirdが提供するAPIのうち、個人的に便利だと思ったものについてまとめます。<br>\nなお、標準のPromiseにも搭載されている機能については割愛します。</p>\n<!--more-->\n<h2 id=\"promisefinally\" style=\"position:relative;\"><a href=\"#promisefinally\" aria-label=\"promisefinally permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Promise#finally</h2>\n<p><a href=\"http://bluebirdjs.com/docs/api/finally.html\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Document</a></p>\n<p><code>.then(fn, fn)</code>や<code>.then(fn).catch(fn)</code>と等価のメソッドです。<br>\n「成功しても失敗してもどちらにせよ実行したい処理」を意味づけして書けるようになります。</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token comment\">// 素のjs（書き方１）</span>\nPromise<span class=\"token punctuation\">.</span><span class=\"token function\">resolve</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span>someCallback<span class=\"token punctuation\">,</span> someCallback<span class=\"token punctuation\">)</span>\n\n<span class=\"token comment\">// 素のjs（書き方２）</span>\nPromise<span class=\"token punctuation\">.</span><span class=\"token function\">resolve</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span>someCallback<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">catch</span><span class=\"token punctuation\">(</span>someCallback<span class=\"token punctuation\">)</span>\n\n<span class=\"token comment\">// Bluebird</span>\n<span class=\"token keyword\">import</span> Promise <span class=\"token keyword\">from</span> <span class=\"token string\">'bluebird'</span>\nPromise<span class=\"token punctuation\">.</span><span class=\"token function\">resolve</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">finally</span><span class=\"token punctuation\">(</span>someCallback<span class=\"token punctuation\">)</span></code></pre></div>\n<h2 id=\"promisejoin\" style=\"position:relative;\"><a href=\"#promisejoin\" aria-label=\"promisejoin permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Promise.join</h2>\n<p><a href=\"http://bluebirdjs.com/docs/api/promise.join.html\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Document</a></p>\n<p><code>Promise.all</code>と似たようなメソッドですが、こちらは可変長引数でPromiseを渡します<br>\nさらに、コールバック関数では、配列ではなく渡したPromiseが１つずつ引数として渡ってきます。<br>\nいちいちバベって<code>.then(([a, b, c]))</code>のように引数を展開する必要が無いので、あらかじめ決まっている複数個のPromiseを待つ処理に便利です</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">import</span> Promise <span class=\"token keyword\">from</span> <span class=\"token string\">'bluebird'</span>\nPromise<span class=\"token punctuation\">.</span><span class=\"token function\">join</span><span class=\"token punctuation\">(</span>\n    Promise<span class=\"token punctuation\">.</span><span class=\"token function\">resolve</span><span class=\"token punctuation\">(</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n    Promise<span class=\"token punctuation\">.</span><span class=\"token function\">resolve</span><span class=\"token punctuation\">(</span><span class=\"token number\">2</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n    Promise<span class=\"token punctuation\">.</span><span class=\"token function\">resolve</span><span class=\"token punctuation\">(</span><span class=\"token number\">3</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n    <span class=\"token comment\">// 配列じゃなくて引数として渡ってくる</span>\n    <span class=\"token punctuation\">(</span><span class=\"token parameter\">one<span class=\"token punctuation\">,</span> two<span class=\"token punctuation\">,</span> three</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>one<span class=\"token punctuation\">,</span> two<span class=\"token punctuation\">,</span> three<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">)</span></code></pre></div>\n<h2 id=\"promiseprops\" style=\"position:relative;\"><a href=\"#promiseprops\" aria-label=\"promiseprops permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Promise.props</h2>\n<p><a href=\"http://bluebirdjs.com/docs/api/promise.props.html\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Document</a></p>\n<p>同じく複数のPromiseを待つユーティリティですが、こちらはオブジェクトを渡せます<br>\nオブジェクトの値すべてがPromiseである必要がなく、一部だけPromiseだったとしてもよしなに処理してくれます</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">import</span> Promise <span class=\"token keyword\">from</span> <span class=\"token string\">'bluebird'</span>\nPromise<span class=\"token punctuation\">.</span><span class=\"token function\">props</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n    one<span class=\"token operator\">:</span> <span class=\"token number\">1</span><span class=\"token punctuation\">,</span>\n    two<span class=\"token operator\">:</span> <span class=\"token number\">2</span><span class=\"token punctuation\">,</span>\n    three<span class=\"token operator\">:</span> Promise<span class=\"token punctuation\">.</span><span class=\"token function\">resolve</span><span class=\"token punctuation\">(</span><span class=\"token number\">3</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">function</span><span class=\"token punctuation\">(</span><span class=\"token parameter\"><span class=\"token punctuation\">{</span> one<span class=\"token punctuation\">,</span> two<span class=\"token punctuation\">,</span> three <span class=\"token punctuation\">}</span></span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>one<span class=\"token punctuation\">,</span> two<span class=\"token punctuation\">,</span> three<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span></code></pre></div>\n<h2 id=\"promisemap\" style=\"position:relative;\"><a href=\"#promisemap\" aria-label=\"promisemap permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Promise.map</h2>\n<p><a href=\"http://bluebirdjs.com/docs/api/promise.map.html\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Document</a></p>\n<p><code>Promise.all(list.map(fn))</code>の略です。<br>\nループ処理してPromiseを待つ処理で、上記のような処理がよく登場してくるかと思いますが、<br>\n若干ネスト（インデント）とタイプ数を削ることができます</p>\n<p>Promise.mapは<strong>同時実行数を指定できます</strong>。第３引数に<code>{concurrency: 3}</code>と渡すと同時に実行する数を3に絞って実行してくれます<br>\nさらに、<strong>インスタンスメソッドとしても実行可能</strong>なので、Promiseベースのパイプラインを作りたいときなどにとても流暢に書けるようになります</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">import</span> Promise <span class=\"token keyword\">from</span> <span class=\"token string\">'bluebird'</span>\nPromise<span class=\"token punctuation\">.</span><span class=\"token function\">map</span><span class=\"token punctuation\">(</span>list<span class=\"token punctuation\">,</span> fn<span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span> concurrency<span class=\"token operator\">:</span> <span class=\"token number\">3</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n\n<span class=\"token comment\">// Promiseのインスタンスメソッドとしても実行可能</span>\nPromise<span class=\"token punctuation\">.</span><span class=\"token function\">map</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">,</span> <span class=\"token number\">3</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> <span class=\"token parameter\">n</span> <span class=\"token operator\">=></span> n<span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">.</span><span class=\"token function\">map</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">n</span> <span class=\"token operator\">=></span> n <span class=\"token operator\">+</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">.</span><span class=\"token function\">map</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">n</span> <span class=\"token operator\">=></span> n <span class=\"token operator\">*</span> <span class=\"token number\">100</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">list</span> <span class=\"token operator\">=></span> console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>list<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span></code></pre></div>\n<h2 id=\"promisemapseries\" style=\"position:relative;\"><a href=\"#promisemapseries\" aria-label=\"promisemapseries permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Promise.mapSeries</h2>\n<p><a href=\"http://bluebirdjs.com/docs/api/promise.mapseries.html\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Document</a></p>\n<p><code>Promise.mapSeries</code>はPromise.mapとはちょっと違う動きをします。<br>\n何らかの副作用を持つ処理などで、「先頭から順番に処理する、Promiseが完了したら次へ」という処理が実現できます</p>\n<p><code>Promise.all</code>とも違います。あればPromiseのインスタンスを渡してしまうので順序や実行数の指定は不可能です。<br>\nPromise.mapSeriesなら配列とPromiseを返す関数を渡すので、先頭から１つずつ処理が可能になります。</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">import</span> Promise <span class=\"token keyword\">from</span> <span class=\"token string\">'bluebird'</span>\n\n<span class=\"token keyword\">const</span> articles <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span>\n    <span class=\"token string\">'記事A'</span><span class=\"token punctuation\">,</span>\n    <span class=\"token string\">'記事B'</span><span class=\"token punctuation\">,</span>\n    <span class=\"token string\">'記事C'</span><span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">]</span>\n<span class=\"token keyword\">const</span> <span class=\"token function-variable function\">publish</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">article</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// 何らかの手段で記事データを公開する非同期処理</span>\n<span class=\"token punctuation\">}</span>\n\nPromise<span class=\"token punctuation\">.</span><span class=\"token function\">mapSeries</span><span class=\"token punctuation\">(</span>articles<span class=\"token punctuation\">,</span> publish<span class=\"token punctuation\">)</span></code></pre></div>\n<h2 id=\"promisecatchreturn\" style=\"position:relative;\"><a href=\"#promisecatchreturn\" aria-label=\"promisecatchreturn permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Promise#catchReturn</h2>\n<p><a href=\"http://bluebirdjs.com/docs/api/catchreturn.html\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Document</a></p>\n<p><code>Promise#catchReturn</code>は、正常系としてrejectされうる処理で、<code>.catch(() => value)</code>などとしたい場合に使えます。</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">import</span> Promise <span class=\"token keyword\">from</span> <span class=\"token string\">'bluebird'</span>\n\n<span class=\"token keyword\">function</span> <span class=\"token function\">hoge</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> Promise<span class=\"token punctuation\">.</span><span class=\"token function\">reject</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">new</span> <span class=\"token class-name\">Error</span><span class=\"token punctuation\">(</span><span class=\"token string\">'エラーだけど正常系'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token function\">hoge</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token string\">'OK'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">catchReturn</span><span class=\"token punctuation\">(</span><span class=\"token string\">'WARNING'</span><span class=\"token punctuation\">)</span></code></pre></div>\n<h2 id=\"promisetap\" style=\"position:relative;\"><a href=\"#promisetap\" aria-label=\"promisetap permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Promise#tap</h2>\n<p><a href=\"http://bluebirdjs.com/docs/api/tap.html\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Document</a></p>\n<p>Promiseの数珠つなぎの途中で<code>console.log</code>などを挟み込みたいときに便利です。</p>\n<p>jsのconsole.logはRubyの<a href=\"http://ref.xaio.jp/ruby/classes/kernel/p\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">p</a>とは異なり戻り値がないので、.thenなどにそのまま渡すことができません。<br>\nなので、最短でも<code>.then(n => {console.log(n); return n})</code>という処理になってしまいますが、それを解消してくれます</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">import</span> Promise <span class=\"token keyword\">from</span> <span class=\"token string\">'bluebird'</span>\n\nPromise<span class=\"token punctuation\">.</span><span class=\"token function\">resolve</span><span class=\"token punctuation\">(</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">.</span><span class=\"token function\">tap</span><span class=\"token punctuation\">(</span>console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">.</span><span class=\"token function\">bind</span><span class=\"token punctuation\">(</span>console<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token comment\">// => 1</span>\n    <span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">n</span> <span class=\"token operator\">=></span> n <span class=\"token operator\">+</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">.</span><span class=\"token function\">tap</span><span class=\"token punctuation\">(</span>console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">.</span><span class=\"token function\">bind</span><span class=\"token punctuation\">(</span>console<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token comment\">// => 2</span>\n    <span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">n</span> <span class=\"token operator\">=></span> n <span class=\"token operator\">+</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">.</span><span class=\"token function\">tap</span><span class=\"token punctuation\">(</span>console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">.</span><span class=\"token function\">bind</span><span class=\"token punctuation\">(</span>console<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token comment\">// => 3</span>\n    <span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">n</span> <span class=\"token operator\">=></span> n <span class=\"token operator\">+</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span></code></pre></div>\n<h2 id=\"promisetimeout\" style=\"position:relative;\"><a href=\"#promisetimeout\" aria-label=\"promisetimeout permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Promise#timeout</h2>\n<p><a href=\"http://bluebirdjs.com/docs/api/timeout.html\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Document</a></p>\n<p>標準のPromiseは途中キャンセルのできないですが、Bluebirdならできます。<br>\nただし、<strong>タイムアウトした処理自体は生きてるいる</strong>のでエラーハンドリングに注意です<br>\n例：タイムアウトすればPromiseはrejectされるが、タイムアウトしたHTTPリクエスト自体は明示的に切断するまで継続する</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">import</span> Promise <span class=\"token keyword\">from</span> <span class=\"token string\">'bluebird'</span>\n\n<span class=\"token keyword\">function</span> <span class=\"token function\">connect</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// なんかに接続する処理</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token function\">connect</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">.</span><span class=\"token function\">timeout</span><span class=\"token punctuation\">(</span><span class=\"token number\">100</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token string\">'OK'</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">.</span><span class=\"token function\">catch</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token string\">'Timeout'</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span>console<span class=\"token punctuation\">.</span>log<span class=\"token punctuation\">)</span></code></pre></div>\n<h2 id=\"promisedelay\" style=\"position:relative;\"><a href=\"#promisedelay\" aria-label=\"promisedelay permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Promise#delay</h2>\n<p><a href=\"http://bluebirdjs.com/docs/api/delay.html\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Document</a></p>\n<p>リトライ処理に便利です。</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">import</span> Promise <span class=\"token keyword\">from</span> <span class=\"token string\">'bluebird'</span>\n\n<span class=\"token comment\">// 素のjsならこう</span>\n<span class=\"token keyword\">const</span> <span class=\"token function-variable function\">delay</span> <span class=\"token operator\">=</span> <span class=\"token parameter\">n</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">new</span> <span class=\"token class-name\">Promise</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">resolve</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token function\">setTimeout</span><span class=\"token punctuation\">(</span>resolve<span class=\"token punctuation\">,</span> n<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">// Bluebirdならこう</span>\nPromise<span class=\"token punctuation\">.</span><span class=\"token function\">delay</span><span class=\"token punctuation\">(</span>n<span class=\"token punctuation\">)</span></code></pre></div>\n<h2 id=\"promisepromisify\" style=\"position:relative;\"><a href=\"#promisepromisify\" aria-label=\"promisepromisify permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Promise.promisify</h2>\n<p><a href=\"http://bluebirdjs.com/docs/api/promise.promisify.html\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Document</a></p>\n<p>Bluebird自体にPromisifyが備わっていたんですね。<br>\nいままで<a href=\"https://www.npmjs.com/package/es6-promisify\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">es6-promisify</a>とかわざわざ別のpromisifyライブラリを使ってました。</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">import</span> fs <span class=\"token keyword\">from</span> <span class=\"token string\">'fs'</span>\n<span class=\"token keyword\">import</span> Promise <span class=\"token keyword\">from</span> <span class=\"token string\">'bluebird'</span>\n\n<span class=\"token keyword\">const</span> readFile <span class=\"token operator\">=</span> Promise<span class=\"token punctuation\">.</span><span class=\"token function\">promisify</span><span class=\"token punctuation\">(</span>fs<span class=\"token punctuation\">.</span>readFile<span class=\"token punctuation\">)</span>\n<span class=\"token function\">readFile</span><span class=\"token punctuation\">(</span><span class=\"token string\">'hoge.json'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'utf-8'</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">content</span> <span class=\"token operator\">=></span> console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>content<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span></code></pre></div>\n<h2 id=\"インスタンスメソッドとしても実行可能\" style=\"position:relative;\"><a href=\"#%E3%82%A4%E3%83%B3%E3%82%B9%E3%82%BF%E3%83%B3%E3%82%B9%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89%E3%81%A8%E3%81%97%E3%81%A6%E3%82%82%E5%AE%9F%E8%A1%8C%E5%8F%AF%E8%83%BD\" aria-label=\"インスタンスメソッドとしても実行可能 permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>インスタンスメソッドとしても実行可能</h2>\n<p>他にも色々便利な機能もあるのですが、最後にBluebirdの恐ろしいところを。<br>\nこれまで紹介した<code>Promise.*</code>と使うクラスメソッドのほとんどは、インスタンスメソッドとしても実行可能です</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">import</span> Promise <span class=\"token keyword\">from</span> <span class=\"token string\">'bluebird'</span>\n\nPromise<span class=\"token punctuation\">.</span><span class=\"token function\">all</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">,</span> <span class=\"token number\">3</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">.</span><span class=\"token function\">map</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">n</span> <span class=\"token operator\">=></span> n <span class=\"token operator\">-</span> <span class=\"token number\">10</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">.</span><span class=\"token function\">mapSeries</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">n</span> <span class=\"token operator\">=></span> n <span class=\"token operator\">*</span> <span class=\"token number\">10</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">nums</span> <span class=\"token operator\">=></span> console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>nums<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span></code></pre></div>\n<p>などなど。<br>\n最近のJavaScriptでは<code>async/await</code>の登場によってかなり書きやすくなっていますが、async/awaitは個人的には手続き型っぽくなるのが嫌いで、<br>\nbluebirdで関数型寄りの書き味な非同期ベースのパイプラインを作ってみるのも良いかもしれません。</p>","timeToRead":6,"frontmatter":{"title":"ネイティブのPromiseより早いbluebirdのPromiseの便利機能をまとめてみた","tags":["Nodejs","JavaScript"],"date":"July 18, 2017","featuredImage":{"childImageSharp":{"fluid":{"tracedSVG":"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='400'%20height='124'%20viewBox='0%200%20400%20124'%20preserveAspectRatio='none'%3e%3cpath%20d='M116%205c-8%203-13%208-20%2020S77%2041%2057%2038l-9-2-1%207c-1%2014-3%2016-19%2019-15%204-17%207-17%2027%200%2011%202%2030%203%2029l3-11c6-25%209-30%2022-32s20-6%2021-12c0-3%200-3%205-1l5%201%201%201%201%202h2l-1-2v-1l-2-6c-2-6-2-6%202-5h11c14-1%2018-4%2021-17%202-14%208-24%2016-29%203-2%201-2-5-1'%20fill='%23d3d3d3'%20fill-rule='evenodd'/%3e%3c/svg%3e","aspectRatio":3.2427184466019416,"src":"/static/c19ef5f92b68c0eba3640d2777edc732/8eab8/featured-image.png","srcSet":"/static/c19ef5f92b68c0eba3640d2777edc732/1ec58/featured-image.png 334w,\n/static/c19ef5f92b68c0eba3640d2777edc732/ccb4a/featured-image.png 668w,\n/static/c19ef5f92b68c0eba3640d2777edc732/8eab8/featured-image.png 1336w,\n/static/c19ef5f92b68c0eba3640d2777edc732/a5deb/featured-image.png 1408w","srcWebp":"/static/c19ef5f92b68c0eba3640d2777edc732/f7e47/featured-image.webp","srcSetWebp":"/static/c19ef5f92b68c0eba3640d2777edc732/cd98f/featured-image.webp 334w,\n/static/c19ef5f92b68c0eba3640d2777edc732/7535d/featured-image.webp 668w,\n/static/c19ef5f92b68c0eba3640d2777edc732/f7e47/featured-image.webp 1336w,\n/static/c19ef5f92b68c0eba3640d2777edc732/770c1/featured-image.webp 1408w","sizes":"(max-width: 1336px) 100vw, 1336px"}}}}}},"pageContext":{"slug":"/benefits-of-node-bluebird/","previous":{"fields":{"slug":"/automate-build-netlify-with-heroku/"},"frontmatter":{"title":"NetlifyとHerokuで予約投稿機能を実現する","tags":["Netlify","Heroku"]}},"next":{"fields":{"slug":"/rn-audio-record/"},"frontmatter":{"title":"React nativeで音声を録音する","tags":["JavaScript","React","React Native","iOS","Android"]}}}},
    "staticQueryHashes": ["2585454260","2954598359"]}