2013-02-27 74 views
0

我想,当我打电话的更新与下面的代码财产“scanner.connect()”方法:当我访问扫描仪如何在CoffeeScript的类更新属性

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...' 

然后.ready属性总是显示为false。

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

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

谢谢!

+0

哦,是的状态返回“连接”我检查了他的 – janex 2013-02-27 18:23:12

+1

为什么连接使用胖箭头? – pdoherty926 2013-02-27 18:31:41

回答

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` 
+0

谢谢!这帮助了我很多。 – janex 2013-02-27 18:44:53

0

可以简化在这条线的=>

connect: (onReady) ->

类方法可以直接访问类变量。但方法内的函数不。