Не видит переменную js. Как получить?

Ссылка скопирована
1 ответ

В самом низу не могу получить данные из переменной. Как записать данные из 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>

Дополнительно:

вызывай свой консоль лог или логика которая есть за место него в твоём кода внутри обработчика

  • szQocks, так мне не нужно внутри
  • Sun2790, ты повесил обработчик, твоей консоль лог отработает до того как вообще что-то придёт с сервера понимаешь ? не выйдет то что ты хочешь
  • Ваш код работать не будет.
    Анонимная функция, в которой вы задаёте значение переменной 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

      За несколько минут не поймал ни разу одних и тех же данных, т.к. почти каждое событие возвращает разные данные, поэтому, наверное будет иметь смысл вообще не сравнивать данные с предыдущими (-нагрузка, -запрос к БД какой-то, возможно), а по таймауту (не по таймауту, интервалом *) записывать в БД последние данные, т.к. они с высокой вероятностью будут другими.

    Нужно решить такую задачу?

    Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

    Заказать помощь
    Лучший ответ
    1
    Сергей Миронов Ответ

    Для того чтобы получить переменную из 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);
            }
        });
    }

    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!";
    }

    if(isset($_POST['variable'])) { $myVariable = $_POST['variable']; echo "Received variable: " . $myVariable; } else { echo "Variable not received!"; }

    Теперь, когда функция sendDataToServer() будет вызвана, значение переменной будет отправлено на сервер и вы сможете получить его в PHP скрипте.

    Не забудьте подключить библиотеку jQuery, если вы используете AJAX запросы в JavaScript.

    Другие ответы (0)

    Пока нет других ответов. Будьте первым, кто поможет автору.

    Ответить на вопрос

    комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *

    Вам также может быть интересно