2016-10-10 240 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没有影响。