Не могли бы вы чем-нибудь помочь?
Я пытаюсь сделать следующее…
import {chosenIpAddress} from './socketEvents.js';
const socket = socketClient(`http:// ${chosenIpAddress} :8081`);
… Но что бы я ни пытался, он просто игнорирует мое выражение и видит его как http: //: 8081. Я пробовал использовать знаки плюса, запятые, обратные кавычки, кавычки, кричать и угрожать, но безуспешно.
Я могу выйти из IP-адреса, поэтому я знаю, что он заполнен, но как часть строки он просто игнорируется, и это сводит меня с ума!
Заранее спасибо ххх
P.S ... Я видел несколько похожих вопросов, но они мне не помогают, отсюда и новый вопрос.
Обновление: по запросу, это мой экспорт ...
let chosenIpAddress = "";
function chosenTank(tank) {
socket.emit('chosen tank', tank);
console.info('Tank', tank);
chosenIpAddress = tank.IpAddress;
}
export {
chosenIpAddress,
};
Это посредник для событий «emit» и «on» между устройствами.
Чтобы быть уверенным, вы это экспортируете, не так ли?
Ха-ха, да. Я могу вывести его из системы здесь, но как часть строки, он просто игнорируется.
Это странно...
Это действительно так, и на данный момент проект критически важен!
На всякий случай, если кто-то еще смотрит, вставьте фрагмент, в который вы экспортируете переменную.
Спасибо, обновил свой вопрос.
Где называется chosenTank? Первоначально вы экспортируете пустую строку, вызов функции, вероятно, происходит в какой-то другой момент времени, поэтому вы можете ее зарегистрировать, но она интерполируется как "".
chosenTank никогда не вызывается, поэтому вы экспортируете { chosenIpAddress: "" }Это называется, я не могу вставить весь проект, так как он очень большой и имеет хорошее разделение проблем, так что это будет очень длинный пост. По сути, пользователю предоставляется экран, на котором он может выбрать свое устройство из списка подключенных устройств, поступающих с сервера, и оттуда вызывается 'selectedTank' и заполняется IP-адрес, поэтому я могу его зарегистрировать. out (если они не выберут один, журнал будет пуст).
Я знал, что это как-то связано с экспортом :)
Это не имеет отношения к экспорту, см. Мой ответ.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вам нужно экспортировать функцию, которая при вызове возвращает IP-адрес.
Файл, импортирующий chosenIpAddress, имеет исходное значение (пустая строка), но он никогда не будет обновлен даже при вызове chosenTake. Строки Javascript копируются по значению, поэтому, если вы обновляете исходную переменную, любые другие ссылки на нее не будет обновляться.
Пример строк, скопированных по значению:
chosenIpAddress = "";
x = chosenIpAddress; // x is ""
chosenIpAddress = "localhost"; // chosenIpAddress is "localhost", x is still ""
// This same issues applies to imports/exports.
Так что сделайте что-то вроде этого в своем файле IP-адреса:
let chosenIpAddress = "";
function chosenTank(tank) {
socket.emit('chosen tank', tank);
console.info('Tank', tank);
chosenIpAddress = tank.IpAddress;
}
function getChosenIpAddress() {
// This can be "" if chosenTank is not called first
return chosenIpAddress;
}
export {
getChosenIpAddress,
};
Кроме того, как указано в комментариях, вам необходимо вызвать chosenTank, прежде чем вы получите доступ к chosenIpAddress, иначе вы будете каждый раз получать пустую строку.
Кроме того, вам также необходимо создать строку сокета как функцию, чтобы при вызове она получала самое актуальное значение от getChosenIpAddress:
import {getChosenIpAddress} from './socketEvents.js';
function getChosenSocket() {
return socketClient(`http://${getChosenIpAddress()}:8081`);
}
Все тот же. Выходит из системы при выборе, но по-прежнему игнорируется как часть строки.
Вам также нужно построить строку как функцию
Нет, см. Мой ответ.
Итак, для всех, кто сталкивается с этой проблемой, я решил ее. Полученный ответ вроде как доходит до цели, но не совсем, я пробовал это (и его вариации), но это / они не сработали.
В основном в моем случае IP-адрес устанавливался при запуске приложения, поэтому selectedIpAddress всегда будет пустой строкой, поскольку он был установлен до того, как произошли соединения, никаких изменений экспорта, отзыва или построения функции не было бы. работа.
Чтобы обойти это, я позволил установить начальное соединение с помощью socketClient 'placeholder', чтобы предотвратить сбой приложения ...
let socket = socketClient('http://:8081');
... а затем, когда все было готово, я позвонил, чтобы повторно заполнить IP-адрес, когда компонент монтируется из внешнего интерфейса ...
Вызывается из внешнего интерфейса, когда все готово ...
componentDidMount() {
frontEndConnected();
}
При необходимости добавьте IP-адрес ...
function frontEndConnected() {
socket = socketClient(`http://${chosenTankIpAddress}:8081`);
}
... который творит шарм.
Какой у вас
socketEvents.js?