2016-10-10 212 views
0

我正在編寫一個程序來從飛行控制器獲取值,然後使用這些值與HUD進行交互。我面臨的問題是我無法從飛行控制器功能中獲取變量並將其傳遞給HUD功能。我試過window沒有運氣,嘗試嵌套功能,以及我在網上找到的其他東西 - 它們都不起作用。任何幫助將非常感激。下面的代碼 -局部變量不成爲全局

這是從飛行控制器拉動數據的部分 -

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

一旦數據被放入roll_in,它需要投入這個功能 -

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); 
} 

即使我在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

這是披薩交付問題。您正在嘗試在返回之前讀取該值。在訂閱中返回值之後,您需要調用您的'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,請不要將它作爲參數傳遞給subscribe回調。

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

當roll_in用作在回調參數,任何該回調將影響參數變量內分配,具有在所述外範圍的roll_in沒有影響。