0

クラスで非同期ライブラリを使用していて、一連のステップの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) ->

なぜこのエラーが発生するのですか?非同期の制御フローを台無しにせずにクラスメソッドを参照するためのより良い方法はありますか?

4

1 に答える 1

0

確認すべき点がいくつかあります。

「update」メソッドの定義では太い矢印を使用しないため、呼び出されたときにメソッドが常に正しい「this」を持つことを絶対に確認する必要があります。通常、これは someinstance.update(...) 呼び出しとして認識されます。

あなたのコードが更新メソッドへの 2 つの呼び出しをトリガーしないことを絶対に確信していますか? 念のため、メソッドの先頭に console.log を追加できます。

エラー処理も少し変わっているように見えます。希望どおりに動作していることを完全に確認するために、例を少しスリム化することをお勧めします。

于 2013-01-20T16:32:31.623 に答える