try catch and ...release
ページ
ホーム
Chromeアプリ開発Tips
公開アプリ
Ubuntu
Linuxコマンド
#!/bin/bash
ブロックチェーンと暗号通貨
2017年4月5日水曜日
古き良きerror-first callback関数をdeasyncでsync関数化
~~ES7で実装される async/awaitは Promise を愛する人たちにとってはとても素晴らしいのでしょうが、古き良き Error-First Style Callback を好む私としてはちょっと使いずらいし、使うにしても一旦Promisifyしないとダメなので面倒です。 そもそも async/await は本当に必要なのでしょうか? 私にとっての答えは No! でした。~~ 今から async/await の代替になる素晴らしいコードをご紹介しましょう。
今回は私のお気に入りのNodeJSモジュールの1つ、`deasync` ([github](https://github.com/abbr/deasync))を使います。 やっていることはGoogleのタイトルを取ってくるだけの簡単なお仕事です: ``` var request = require('request'); var deasync = require("deasync"); var cheerio = require("cheerio"); function getTitle(cb) { request({ url: "http://www.google.com" }, (err, resp, body) => { let $ = cheerio.load(body); return cb && cb(err, $("title").text()); }); } console.log("getTitle -> getTitleSync"); let getTitleSync = deasync(getTitle); console.log("getTitleSync..."); let result; try { result = getTitleSync(); } catch (e) { console.log("Exception:", e); } console.log("result:", result); /** Result: getTitle -> getTitleSync getTitleSync... result: Google */ ``` `getTitle`という古き良き error-first styled callback な非同期関数を`deasync`を使って`getTitleSync`という同期関数に変換して使っています。 同期関数化された関数では、第一引数にErrorが返された時は `try catch` でキャッチすることもできます。 このようにすれば、たとえ promise と async/await がなくても、大抵のことは出来ますし、過去の素晴らしいコード資産を活かせるのも大きのではないでしょうか。 よく「コールバック地獄」という言葉がありますが、最近になってアレは神話に過ぎないのだろうと確信しています。非同期処理の同期っぽい処理やネスト地獄の解消は、今回紹介した `deasync` の他にも [step](https://github.com/creationix/step)や [co](https://github.com/tj/co) または標準APIの [generator](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Generator) を使えば大抵の場合シンプルに解決します。 それよりもネストが深くなったPromiseなコードのほうがよっぽど「地獄」だと個人的には感じています。上手く使えばコードが見やすくなるはずのPromiseも、階層が深くなるような書き方をしてしまうえば、とたんに直感性も失われてデバッグするのも相当キツくなります。だからこその Async/Await なんでしょうけど、既に在るものを利用してシンプルに解決してみるという選択肢もあってもいいと思ってこの記事を書きました。(ツッコミ大歓迎です) ### 追記 deasyncはブラウザでは使えません。ブラウザで使うなら `step` や generator を使うのが個人的にはおすすめです。 ### 追記2 同期関数はパフォーマンスが必要な処理では使うべきではありません。非同期処理を同期っぽく使うなら`step`などを使いましょう。 ### 追記3 2017/11/22 Promisifyはいつのまにか不要になってましたね。 シンプルな callback は相変わらず手放せませんが、今は async/await というか Promise も好きになりつつありますw
0 件のコメント:
コメントを投稿
次の投稿
前の投稿
ホーム
登録:
コメントの投稿 (Atom)
0 件のコメント:
コメントを投稿