2013-02-27 64 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) ->

類方法可以直接訪問類變量。但方法內的函數不。