0

当我调用“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,所以我知道我做错了什么哈哈,但我不确定是什么。

谢谢!

4

2 回答 2

1

你的咖啡脚本看起来不错,这里应该归咎于执行顺序,这个问题也让普通的 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`
于 2013-02-27T18:30:58.233 回答
0

您可以简化=>这一行:

connect: (onReady) ->

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

于 2013-02-28T13:54:17.000 回答