LoginSignup
4
5

More than 5 years have passed since last update.

Async.js v2の過去非互換変更について

Posted at

async.jsのバージョンをあげたら今まで動いていたコードが動かなくなった。調べてみたらversion 2.0になって過去非互換な変更が入っていたのでここで簡単にまとめておきます。

なお、確認に使ったのは 2.0.0-rc4なのでまだ変わる可能性はゼロではないと思います。

変更は、以下の関数に影響がありそう。

  • filter, filterSeries, filterLimit
  • detect, detectSeries, detectLimit
  • some, someSeries, someLimit
  • every, everySeries, everyLimit
  • auto
  • retry

数が多いように見えるが、最初の4種類(filter, detect, some, every)はほぼ同じ変更で、Callback関数の引数の変更。例えばfilterを例に取ってみると、これまでは

var async = require('async');

async.filter([1, 2, 3], function(item, callback) {
  callback(item > 1);
}, function (results) {
  console.log(results);
});

と書けていたものが、

var async = require('async');

async.filter([1, 2, 3], function(item, callback) {
  callback(null, item > 1);
}, function (err, results) {
  console.log(results);
});

と書かなければならなくなる。変更点は以下の二点。

  • iteratee (与えられたリストの要素一つ一つに適用される関数)の中で呼ばれるコールバック関数の引数がcallback(truthValue)からcallback(error, truthValue)となった。iterateeの中でエラーが起きた時に第一引数にエラーの値を渡せるようになったのだが、逆に言うと、エラーじゃない時にはnullなどif文でfalse判定されるものを入れて置かなければならない。
  • async.filterの第三引数に設定するコールバック関数の引数がcallback(results)からcallback(error, results)となった。このコールバックは通常は全てのiterateeの処理が終わった後に呼び出されるのだが、iterateeから一つでもerrorが上った時には直ちにこのコールバックが呼ばれる。

detect, some, everyもiterateeで真偽判定を行ってその結果をコールバックで返す形式なので、同じようにコールバックでのエラー指定とその結果受け取りの引数が増えている。

それから、autoはコールバックの引数の順番変更。

v1ではこう書けていたのが

var async = require('async')

async.auto({
    a: function(callback){
        console.log('in a');
        callback(null, 'a1');
    },
    b: function(callback){
        console.log('in b');
        callback(null, 'b1');
    },
    c: ['a', 'b', function(callback, results){
        console.log('in c', JSON.stringify(results));
        callback(null, 'c1');
    }]
}, function(err, results) {
    console.log('err = ', err);
    console.log('results = ', results);
});

v2でこうなる。

var async = require('async')

async.auto({
    a: function(callback){
        console.log('in a');
        callback(null, 'a1');
    },
    b: function(callback){
        console.log('in b');
        callback(null, 'b1');
    },
    c: ['a', 'b', function(results, callback){
        console.log('in c', JSON.stringify(results));
        callback(null, 'c1');
    }]
}, function(err, results) {
    console.log('err = ', err);
    console.log('results = ', results);
});

どこが違うのか、もはや間違い探しのレベルだが、正解は c: のタスクとして呼び出している関数の引数の順番。従来はtask(callback, results)だったのがtask(results, callback)となった。

そして残ったretryだがこれはどう変わるのかが今ひとつ判らなかった。「コールバックは2.0でオプショナルになった。そして、v1のretryretryableとして残してあるよ」と書いてあるのだが、retryの説明はv1とv2で変わっていないし、もしかしてこれからドキュメントの更新とかあるのかな。なにか判ればあとからでもここに追記しよう。

4
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
5