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スキャナーが1秒未満で準備ができている限り、ログに記録されます。しかし、それはあなたがこのコードを構造化する方法ではありません。


正しい方法は、これの代わりに、代わりに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 に答える