如何更新coffeescript类中的属性

时间:2013-02-27 18:21:18

标签: coffeescript

当我调用“scanner.connect()”方法时,我正在尝试使用以下代码更新属性:

class Scanner
    ready: false

    connect: () =>
        cordova.exec (status) =>
            console.log status
            if status is 'connected'
                @ready = true
                console.log @ready
        ,
        (error) ->
            console.log error
        ,
        "LineaProScanner", "ready", []

    scan: () ->
        console.log 'start scan...'
    stop: () ->
        console.log 'stopping scan...'

然后当我访问scanner.ready属性时,它总是显示为false。

scanner = new Scanner()
scanner.connect()
console.log scanner.ready // always shows false

我刚开始使用CoffeeScript,所以我知道我做错了什么哈哈但是我不确定是什么。

谢谢!

2 个答案:

答案 0 :(得分:1)

你的coffeescript看起来很好,它的执行顺序应该归咎于这个问题,这个问题也让那些普通的JS程序员惹恼了。

我打赌cordova.exec()是异步的,所以你在它回电之前询问它是否准备好并准备就绪。

试试看我是否正确:

scanner = new Scanner()
scanner.connect()
setTimeout (-> console.log scanner.ready), 1000

只要扫描仪在不到一秒的时间内准备就绪,就应该记录true。但这不是你应该如何构造这个代码。


正确的方法是代替这个setTimeout而不是你想要自己的回调。

class Scanner
    ready: false

    # Accept a callback argument on the connect method.
    connect: (onReady) =>
        cordova.exec (status) =>
            console.log status
            if status is 'connected'
                @ready = true
                console.log @ready

                # call the onReady callback if it was passed in
                onReady?()
        ,
        (error) ->
            console.log error
        ,
        "LineaProScanner", "ready", []

现在你可以做到:

scanner = new Scanner()
scanner.connect ->
  console.log scanner.ready # should log `true`

答案 1 :(得分:0)

您可以简化此行的=>

connect: (onReady) ->

类方法可以直接访问类变量。但是方法中的函数没有。