Не видит переменную js. Как получить?
В самом низу не могу получить данные из переменной. Как записать данные из dd в vv и вывести в консоль?
<script> const ws = new WebSocket("wss://stream.binance.com:9443/ws/xrpusdt@bookTicker"); ws.onmessage = (event) => { const obj = JSON.parse(event.data); if (obj.s=='XRPUSDT'){ // console.log(`Symbol: ${obj.s}`); // console.log(`Best ask: ${obj.a}`); // console.log(`Best bid: ${obj.b}`); } let dd = obj.s; console.log(dd); // видим данные } /// как вывести данные снизу? let vv = dd; console.log(vv); // ЗДЕСЬ НЕ ВИДИМ ДАННЫЕ </script> |
<script> const ws = new WebSocket("wss://stream.binance.com:9443/ws/xrpusdt@bookTicker"); ws.onmessage = (event) => { const obj = JSON.parse(event.data); if (obj.s=='XRPUSDT'){ // console.log(`Symbol: ${obj.s}`); // console.log(`Best ask: ${obj.a}`); // console.log(`Best bid: ${obj.b}`); } let dd = obj.s; console.log(dd); // видим данные } /// как вывести данные снизу? let vv = dd; console.log(vv); // ЗДЕСЬ НЕ ВИДИМ ДАННЫЕ </script>
Дополнительно:
вызывай свой консоль лог или логика которая есть за место него в твоём кода внутри обработчика
Ваш код работать не будет.
Анонимная функция, в которой вы задаёте значение переменной dd будет вызвана только при наступлении события message, то есть при приходе сообщения от WS-сервера. А это сообщение может прийти как сразу же, так и через час.
Кроме того, даже при приходе события, вызов функции будет помещён в очередь и выполнится только после завершения выполнения текущего кода, то есть когда console.log(vv) уже отработает.
const ws = new WebSocket("wss://stream.binance.com:9443/ws/xrpusdt@bookTicker") let dd = null ws.onmessage = (event) => { const obj = JSON.parse(event.data) if(obj.s=='XRPUSDT'){ /* ... */ } dd = obj.s console.log(dd) } let vv = dd console.log(vv) |
const ws = new WebSocket("wss://stream.binance.com:9443/ws/xrpusdt@bookTicker") let dd = null ws.onmessage = (event) => { const obj = JSON.parse(event.data) if(obj.s=='XRPUSDT'){ /* ... */ } dd = obj.s console.log(dd) } let vv = dd console.log(vv)
Область видимости переменных
- Так уже делал. Возвращает null
- Sun2790, кстати, да, Rsa97 ответом ниже правильно ситуацию описал.
- Sun2790, ну а вообще, смотря что ты хотел делать дальше. Если просто дождаться первого сообщения, то можно так:
const ws = new WebSocket('wss://stream.binance.com:9443/ws/xrpusdt@bookTicker') const data = { XRPUSDT: await new Promise(resolve => { ws.onmessage = e => { const message = JSON.parse(e.data) if(resolve) resolve(message) else if(message.s === 'XRPUSDT') data.XRPUSDT = message } }) } console.log(data)
const ws = new WebSocket('wss://stream.binance.com:9443/ws/xrpusdt@bookTicker') const data = { XRPUSDT: await new Promise(resolve => { ws.onmessage = e => { const message = JSON.parse(e.data) if(resolve) resolve(message) else if(message.s === 'XRPUSDT') data.XRPUSDT = message } }) } console.log(data)
- muscimolus, Планировалось записывать полученные данные в БД
- muscimolus, У меня идет списком.
let ws= new WebSocket('wss://stream.binance.com:9443/stream?streams=1000satstry@bookTicker/acatry@bookTicker/acetry@bookTicker ///..... и так далее
let ws= new WebSocket('wss://stream.binance.com:9443/stream?streams=1000satstry@bookTicker/acatry@bookTicker/acetry@bookTicker ///..... и так далее
далее я хочу получить
let XRP // получил данные xrp, если нужно, обновили, записали в бд
let ACE
и так далее - Sun2790, если класть в БД, то тебе проще это реализовать на сервере, где ты внутри события реализуешь логику добавления/обновления всего этого в БД, т.к. пулять на сервер инфу с клиента, который сам от кого-то получил эту инфу - как-то сомнительно, если ты конечно не для себя делаешь и может быть локально. Но мне всё ещё непонятно, для чего тебе нужны были данные за которые отвечает обработчик вне этого обработчика.
- Sun2790, например, на коленке за 5 минут (Deno):
// const db = new DB(...) const rates = new Map() let socket = null const connect = () => { socket = new WebSocket('wss://stream.binance.com:9443/stream?streams=1000satstry@bookTicker/acatry@bookTicker/acetry@bookTicker') socket.onopen = async () => { // await db.connect(...) или db.open() и т.п. } socket.onmessage = async ({ data: message }) => { const { data } = JSON.parse(message) delete data.u // Если логика Object.is if(!Object.is(rates.get(data.s), data)){ rates.set(data.s, data) // await db.query(...) console.log('Changed: ', data.s) } else { console.log('Not changed: ', data.s) } } socket.onerror = e => console.error(e) socket.onclose = async () => { /* await db.close() или db.end() и т.п. */ console.log('reconnect') socket = connect() } return socket } socket = connect() setInterval(() => socket.close(), 5000) // test// const db = new DB(...) const rates = new Map() let socket = null const connect = () => { socket = new WebSocket('wss://stream.binance.com:9443/stream?streams=1000satstry@bookTicker/acatry@bookTicker/acetry@bookTicker') socket.onopen = async () => { // await db.connect(...) или db.open() и т.п. } socket.onmessage = async ({ data: message }) => { const { data } = JSON.parse(message) delete data.u // Если логика Object.is if(!Object.is(rates.get(data.s), data)){ rates.set(data.s, data) // await db.query(...) console.log('Changed: ', data.s) } else { console.log('Not changed: ', data.s) } } socket.onerror = e => console.error(e) socket.onclose = async () => { /* await db.close() или db.end() и т.п. */ console.log('reconnect') socket = connect() } return socket } socket = connect() setInterval(() => socket.close(), 5000) // test
За несколько минут не поймал ни разу одних и тех же данных, т.к. почти каждое событие возвращает разные данные, поэтому, наверное будет иметь смысл вообще не сравнивать данные с предыдущими (-нагрузка, -запрос к БД какой-то, возможно), а по таймауту (не по таймауту, интервалом *) записывать в БД последние данные, т.к. они с высокой вероятностью будут другими.
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
Для того чтобы получить переменную из JavaScript в PHP, необходимо использовать AJAX запрос. AJAX (Asynchronous JavaScript and XML) позволяет обмениваться данными между браузером и сервером без перезагрузки страницы.
Прежде всего, создайте функцию в JavaScript, которая будет отправлять значение переменной на сервер. Например:
function sendDataToServer() { var myVariable = "Hello, World!"; $.ajax({ type: "POST", url: "your_php_script.php", data: { variable: myVariable }, success: function(response) { console.log("Data sent successfully!"); }, error: function(xhr, status, error) { console.error("Error sending data to server: " + error); } }); }
Затем, в вашем PHP скрипте (например, your_php_script.php) можно получить значение переменной следующим образом:
if(isset($_POST['variable'])) { $myVariable = $_POST['variable']; echo "Received variable: " . $myVariable; } else { echo "Variable not received!"; }
Теперь, когда функция sendDataToServer() будет вызвана, значение переменной будет отправлено на сервер и вы сможете получить его в PHP скрипте.
Не забудьте подключить библиотеку jQuery, если вы используете AJAX запросы в JavaScript.