2016-10-10 3 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); 
} 

Даже если я положил console.print(roll_in) сразу после функции listenerImu, он печатает 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'. Должен ли я передать переменную в функцию функции функции 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, не передавайте ее в качестве аргумента для обратного вызова подписки.

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

Когда roll_in используются в качестве аргумента в функции обратного вызова, любом назначенных внутри этого обратного вызова будет влиять на переменном аргумент, не имеющий никакого влияния на roll_in внешнего прицела.