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のretry
はretryable
として残してあるよ」と書いてあるのだが、retryの説明はv1とv2で変わっていないし、もしかしてこれからドキュメントの更新とかあるのかな。なにか判ればあとからでもここに追記しよう。