クラスで非同期ライブラリを使用していて、一連のステップの1つで太い矢印を使用すると、2つのコールバックが発生します。太い矢印の関数は、一連の次のステップではなく、終了ステップを直接呼び出します。どうしてこれなの?これは簡単な例です。
class FakeProfileRepository
getByEmail : (email, callback) ->
return callback null, email
update : (data, callback) ->
async.series
checkNull: (next) ->
if data and data.uname
next null
else
next Error("No profile to save")
checkEmailExists: (next) =>
@getByEmail 'test', (err, results) ->
if not results
next new Error("Could not find an existing profile to update")
else
next err
checkProfile: (next) ->
return next new Error('foo')
, (err, results) ->
console.log('series ended with error:' + err)
これにより、追加のコールバックが発生し、checkEmailExistsが最終結果関数へのコールバックを発生させ、checkProfileステップが(正しく)最後の結果関数を発生させます。
EXPECTED:
series ended with error:foo
ACTUAL: (two callbacks fired)
series ended with error:foo
series ended with error:null
このエラーは、太い矢印を使用した場合、またはself=thisを設定して通常の矢印を使用した場合でも発生するようです。
checkEmailExists: (done) ->
self.getByEmail data.uname, (err, results) ->
なぜこのエラーが発生するのですか?非同期の制御フローを台無しにせずにクラスメソッドを参照するためのより良い方法はありますか?