2016-10-10 11 views
0

フライトコントローラから値を取得し、それらの値を使ってHUDとやりとりするプログラムを作成しています。私が直面している問題は、フライトコントローラ関数の内部から変数を取得してHUD関数に渡すことができないということです。私は運がないwindowを試してみました。機能を入れ子にしました。そして、私がオンラインで見つけた他のものもありました。どんな助けでも本当に感謝しています。ローカル変数がグローバルにならない

これは、フライトコントローラからデータを引き出し部分です - - ここでは、コードです

function FlightIndicator(placeholder, type, options) { 
    var attitude = this; 
    var settings = $.extend({ 
     size: 500, 
     roll: roll_in, // Vehicle Roll 
     pitch: pitch_in, // Vehicle Pitch 
     turn: 0, 
     heading: 0, 
     vario: 0, 
     airspeed: 0, 
     altitude: 0, 
     pressure: 1000, 
     showBox: false, 
     img_directory: 'jQuery-Flight-Indicators-master/img/' 
    }, 
    options); 
} 
-

var roll_in; 
listenerImu.subscribe(function(message, roll_in) { 
    roll_in = (message.twist.linear.x) * (-57.2958); 
    return roll_in; 
}); 

データはroll_inに入れられるとは、それがこの機能に置かれる必要があります

listenerImuの直後にconsole.print(roll_in)を置いても、undefinedが表示されます。

ありがとうございます!

+0

ブロックスコープでroll_inを定義するためです。その返品は何もしません – epascarello

+0

彼は 'window.roll_in'を試したと言いました。 'roll_in'が宣言されているファイル全体と、このスクリプトが実行されている場所が必要な場合がありますか?ブラウザで? –

+0

注:[可変シャドーイング](https://en.wikipedia.org/wiki/Variable_shadowing)。 –

答えて

2

変数を関数の引数として宣言したときに、変数をブロックスコープで再定義します。

var roll_in; //global 
listenerImu.subscribe(function(message, roll_in) { //creates a new variable here in this block scope 
    roll_in = (message.twist.linear.x) * (-57.2958); //uses the argument, not global 
    return roll_in; //this line appears to do nothing 
}); 

あなたのコードは、ちょうどこの

var roll_in; 
listenerImu.subscribe(function(message) { 
    roll_in = (message.twist.linear.x) * (-57.2958); 
}); 

今、次の問題がsubscribeでは、その行がトリガされるまで、変数roll_inは未定義になりますので、非同期呼び出しになるだろうしなければなりません。 console.log()行を追加すると、未定義のまま表示されます。これは、オンラインでピザを注文するようなものです。あなたの家に現れない限り、食べることはできません。

+0

申し訳ありませんが、私はあなたの提案に切り替えました。今、私がプログラムを実行すると、私は、この行にroll_inが定義されていないというエラーが出ています.'roll:roll_in'。変数を 'function FlightIndicator'関数に何とか渡す必要がありますか?私は変数が常に更新されていることを知っている、私は情報がroll_inに渡されて見ることができます –

+0

それはピザの配信の問題です。値が返される前に値を読み取ろうとしています。値がsubscribeに戻った後で 'FlightIndicator'メソッドを呼び出す必要があります。 – epascarello

+0

申し分なく、それは理にかなっています。あなたはそれを何と呼びますか?内部に 'FlightIndicator'関数全体を入れますか?あなたの助けにもう一度感謝epascarello。 –

0
var roll_in; 
    listenerImu.subscribe(function(message, roll_in) { 
     roll_in = (message.twist.linear.x) * (-57.2958); 
     ^This is the parameter roll_in 

roll_inパラメータを変更するだけです。

0

変数を外部スコープroll_inに割り当てる場合は、それをサブスクライブコールバックの引数として渡さないでください。 roll_inはないが、外側のスコープのroll_inに影響のない、コールバック内の引数は、引数の変数に影響を与えることコールバックの内部に割り当てられているとして使用さ

var roll_in; 
listenerImu.subscribe(function(message) { 
    roll_in = (message.twist.linear.x) * (-57.2958); 
}); 

関連する問題