0

我在一个类中使用异步库,并在其中一个系列步骤中使用粗箭头会导致触发两个回调,其中带有粗箭头的函数直接调用结束步骤,而不是系列中的下一步。为什么是这样?这是一个简化的例子。

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) ->

为什么会出现这个错误,有没有更好的方法来引用类方法,又不会搞乱async的控制流程?

4

1 回答 1

0

有几件事要检查;

您对“更新”方法的定义不使用粗箭头,因此您需要绝对确保该方法在调用时始终具有正确的“this”。通常,您会将其识别为 someinstance.update(...) 调用。

您绝对确定您的代码不会触发对更新方法的两次调用吗?您可以在方法的开头添加一个 console.log 以确保。

您的错误处理看起来也有些古怪,您可能希望稍微精简一下示例,以确保它的行为符合您的要求。

于 2013-01-20T16:32:31.623 回答