はじめに
Async/Await
により同期処理と非同期処理の垣根が低くなり、可読性の高いコードを実現できるようになりました。
しかしサードパーティのライブラリを眺めても、同期関数と非同期関数が全く同じような書き方で書ける方法はなかなか存在しません。そこで同期関数を非同期関数化することにより、Async/Await
を用いてほぼ同じ書き方で可読性の高いコードを実現する方法を紹介します。
同期関数の非同期関数化
今回は同期処理でおなじみのLodash
をAigle
を用いて非同期化します。
今回のゴールは、Lodash
の関数を非同期化することにより、Lodash
と同じ使い方で非同期処理をすることです。
今回使用するライブラリをインストールします。
$ npm install -S lodash aigle
次にLodash
の関数を非同期化します。
const _ = require('lodash');
const Aigle = require('aigle');
Aigle.mixin(_);
以上で非同期化されました。
例
非同期関数のサンプルとしてdelay
という関数を定義します。この関数はms
後にresult
を返す非同期関数です。
function delay(ms, result) {
return new Promise(resolve => setTimeout(resolve, ms, result));
}
Lodash.map
Lodash.map
を非同期関数化した例です。Aigle.map
は10ms後にそれぞれのresult
を返し、全てのarrayのresult
が揃い次第結果を返します。
const array = [1, 2, 3];
const syncResult = _.map(array, n => n * 2); // [2, 4, 6];
const asyncResult = await Aigle.map(array, n => delay(10, n * 2)); // [2, 4, 6]
Lodash.find
Lodash.find
を非同期関数化した例です。Aigle.find
はtruthy
を受け取り次第結果を返します。
const array = [1, 2, 3];
const syncResult = _.find(array, n => n === 2); // 2
const asyncResult = await Aigle.find(array, n => delay(10, n === 2)); // 2
Lodash.chain
Aigle
ではLodash.chain
のようにメソッドチェインを使用することが可能です。メソッドチェインではLodash.chain
と同様に直前の関数の結果を次の関数に渡します。
const array = [1.1, 1.4, 2.2];
const syncResult = _.chain(array)
.map(n => n * 2) // [2.2, 2.8, 4.4]
.uniqBy(Math.floor) // [2.2, 4.4]
.sum() // [6.6]
.times() // [0, 1, 2, 3, 4, 5]
.value();
const asyncResult = await Aigle.resolve(array)
.map(n => delay(10, n * 2)) // [2.2, 2.8, 4.4]
.uniqBy(Math.floor) // [2.2, 4.4]
.sum() // [6.6]
.times(); // [0, 1, 2, 3, 4, 5]
またAigle
の各関数は同期処理・非同期処理双方の処理が可能です。サンプルコード はこちらにも載せておきました。
まとめ
Aigle.mixin
はLodash
以外の関数・ライブラリにも使用することができます。またAigle
は可読性の高いコードを提供するだけでなく、高パフォーマンスのコードを実現しています。興味ある方は下記の記事も読んでいただけたら嬉しいです。すでに本番環境でも使用しています、是非使ってみてください。