Как заставить клиента ждать ответа от сервера socket.io, node js?

127
07 августа 2019, 00:00

Нужно сделать так чтобы клиент ждал ответа от сервера. Внутри блока socket.on(...) quest_data выдает желанный массив, за пределами блока выдает undefined.

Код клиента

var socket = io("http://localhost:3000");
var quest_data = [];
var answ_data = [];
function getAnswers(){
  //Поиск вопросов
    var quest = document.getElementsByClassName("qtext");
  //Запаковка их в объект
    var data = {
        questions: []
    }
    for(var i = 0;i<quest.length;i++) {
        data.questions[i] = quest[i].innerHTML;
    }
    console.log(data);
    //Отправка на сервер
    socket.emit("gimmeQA",data);
    console.log("Вопросы отправлены");
    console.log("Ждем ответа");
    //Получение ответов с сервера
    socket.on("gimmeQA",function(data){
        var my_json = JSON.parse(data);
        quest_data = my_json.questions;
        answ_data = my_json.answers;
        console.log("Данные получены");
        console.log(quest_data); //Получен массив вопросов
    });
}
getAnswers();
console.log(quest_data); //undefined

Код сервера node.js

var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);
var fs = require("fs");
io.on('connection', function(socket){
  console.log('a user connected');
  socket.on("disconnect",function(){
    console.log("user disconnected");
  });
  socket.on('gimmeQA', function(json_obj) {
    console.log('Запрос правильных ответов');
    socket.emit("gimmeQA", findAnswers(json_obj));
    console.log("Ответ отправлен");
  });
Answer 1

Решил проблему через Promises

Вот решение:

var socket = io("http://localhost:3000");
var quest_data = [];
var answ_data = [];
let getAnswers = function(){
  //Поиск вопросов
    var quest = document.getElementsByClassName("qtext");
  //Запаковка их в объект
    var data = {
        questions: []
    }
    for(var i = 0;i<quest.length;i++) {
        data.questions[i] = quest[i].innerHTML;
    }
    console.log(data);
    //Отправка на сервер
    socket.emit("gimmeQA",data);
    console.log("Вопросы отправлены");
    console.log("Ждем ответа");
    //Получение ответов с сервера
    return new Promise(function(resolve,reject){
    socket.on("gimmeQA",function(data){
      var my_json = JSON.parse(data);
      quest_data = my_json.questions;
      answ_data = my_json.answers;
      console.log("Данные получены");
      resolve("resolve")
    });
  });
}
getAnswers().then((msg) => {
    console.log("ура " + msg);
    console.log(quest_data);
  });

Исправил код теперь работает как надо.

READ ALSO
Мини графический редактор на canvas и vuex

Мини графический редактор на canvas и vuex

Сделал небольшой редактор изображений для изучения возможностей vuex с состояниями

144
На чем пишут калькулятор доставки? [закрыт]

На чем пишут калькулятор доставки? [закрыт]

Скорее всего скрипт, но как понимаю, есть варианты с использованием обращений к БД, либо без негоХотелось бы конечно без, но в чем плюсы с БД и различия...

147
Обработка div&#39;a циклом в Javascript

Обработка div'a циклом в Javascript

Есть кусок кода сайта

141