はじめに
ES2017以降はasync functions (async/await)が使えるようになりこれまでと、非同期処理の書き方が変わりました。callback時代はasync.jsに大変お世話になっていたのですが、async/awaitで書くようになって、ちょっとオーバースペックな気もしてきました。そこで、もう少し軽量な代替ライブラリがないか探していたところ一つ気になるものがあったので、調べてみました。
blend-promise-utils
promise-utilsは、promiseベースのユーティリティです。軽量なところと、TypeScriptなところが評価できます。mapはPromise.allで簡単に実現できるので、mapSeriesの例を見てみましょう。
const fetchUserInfo = async (id) => {
const response = await fetch(`https://reqres.in/api/user/${id}?delay=1`);
return await response.json();
};
上記のようなasync関数があると仮定します。
import promiseUtils from 'blend-promise-utils';
const run = async () => {
const userIds = [1, 2, 3, 4, 5];
const users = await promiseUtils.map(userIds, fetchUserInfo);
return users;
};
promise-utilsで書くと上記のようになります。
import async from 'async';
const run = async () => {
const userIds = [1, 2, 3, 4, 5];
const users = await async.mapSeries(userIds, fetchUserInfo);
return users;
};
async.jsの場合はこのようになります。全く変わりませんね。
promise-utilsの場合はfetchUserInfoを呼び出すときに第二引数にindexを渡してくれるようです。Array.prorotype.mapとの類推ではその方が適切な感じはします。
mapのソースを見ていたら、少し予想外のものがありました。省略時には上限が設定されるようです。この上限を取るには、 mapLimit(list, list.length, func)
とするしかなさそうです。
軽量なのは良いことだと思いましたが、raceなどはなく、その他機能不足を感じました。乗り換えるにはちょっと力不足な感じがします。
おわりに
気になるライブラリではあったものの、用途は限られそうなので、async.jsの代替にはならないかと思いました。また、引き続き探したいと思います。
ところで、簡単なparallelやseriesくらいであればライブラリを使わなくてもそれほど苦労せずに書けるので普段はそれで済ましています。このブログによると、limit系も書けてしまうようで、ライブラリは不要なのではないかとも思ってしまいます。でも、複雑ではあるのでやはり手頃なライブラリがあると良いですね。