Как я могу обновить сообщение из события Разница socket.io? - PullRequest
0 голосов
/ 24 сентября 2019

Я использую API с разницей событий channelName1 и channelName2

//...this the realtime record
socket.on(channelName1, message => {
      console.log(channelName1, message1);
      //this return single item list in realtime`[{"price":100,"size":0.001}]`
 });

//realtime snapshot collection of records
socket.on(channelName2, message => {
   console.log(channelName2, message2);
   //this return the collection `[{"price":100,"size":0.01}, {"price":200,"size":0.02} ]`
   $('#live').text(message2)
});

Я хочу обновить размер message2, если обнаружил, что price":100 присутствует в коллекцииmessage2, поэтому сообщение после обновления2 будет

[{"price":100,"size":0.001}, {"price":200,"size":0.002} ]

Кто-нибудь может подсказать, как я могу выполнить это обновление с channelName1 на данные ChannelName2?

Ответы [ 2 ]

0 голосов
/ 30 сентября 2019

вы можете хранить данные канала1 в hashMap и циклически перебирать данные канала2, чтобы проверить, есть ли запись в хэш-карте, и вернуть элемент в соответствии с этим.

const channel1HashMap = {};

//...this the realtime record
socket.on(channelName1, message => {
   console.log(channelName1, message1);
   dataHandler(message1, null);
});

//realtime snapshot collection of records
socket.on(channelName2, message => {
   console.log(channelName2, message2);
   const data = dataHandler(null, message2);
   updateView(data);
});

dataHandler = (message1, message2) => {
  const channel2Data = [];
  if(Array.isArray(message1)) {
    message1.forEach((message)=> {
       channel1HashMap[message.price] = message;
    });
  } else if(Array.isArray(message2)) {
    message2.forEach((message)=> {
      if(Object.prototype.hasOwnProperty.call(channel1HashMap, message.price)){
        channel2Data.push(channel1HashMap[message.price]);
      } else {
        channel2Data.push(message);
      }
    });
  }
  return channel2Data;
}

updateView = (data) => {
  $('#live').text(data)
}

0 голосов
/ 28 сентября 2019

Вы должны где-то хранить отдельные предметы, и когда коллекция прибудет, вам необходимо:

  1. Обработать каждый предмет коллекции, используя map .
  2. Для каждого элемента попробуйте найти его в сохраненных единичных элементах.
  3. Если найден, измените размер.

Я также включил запись вколлекция, которую нельзя найти, чтобы вы могли видеть, что там происходит: она остается неизменной.

Не обращайте внимания на небольшие изменения, которые я сделал для имитации сокетов.Надеюсь, вы сможете увидеть общую картину того, что я делаю.

Надеюсь, это поможет и удачного кодирования.

// Stores each single item that arrives.
let singleItems = [];

// ...this is the realtime record.
function socketOn1(channelName1, message1) {
  console.log(channelName1, message1);

  // Store each single item as it arrives.
  singleItems.push(message1[0]);
};

// realtime snapshot collection of records
function socketOn2(channelName2, message2) {
  console.log(channelName2, message2);

  // For each element in the collection, find
  // the same record in the single items and
  // if found, update the price.
  results = message2.map((elem) => {
    found = singleItems.find(
      (single) => single.price === elem.price
    )
    if (found) {
      elem.size = found.size
    }
    return elem
  })

  console.log('results:')
  console.log(results)
};


// This stuff just simulates stuff arriving to sockets.
// You can ignore it if you want. But look at the order
// in which they are called.

let singleItemsMock = [{
    "price": 100,
    "size": 0.01
  },
  {
    "price": 50,
    "size": 0.02
  },
  {
    "price": 25,
    "size": 0.03
  },
  {
    "price": 10,
    "size": 0.04
  }
]

let collectionMock = [{
    "price": 100,
    "size": 0.001
  },
  {
    "price": 50,
    "size": 0.002
  },
  {
    "price": 13,
    "size": 0.005
  }
]

socketOn1(null, [singleItemsMock[0]])
socketOn1(null, [singleItemsMock[1]])
socketOn1(null, [singleItemsMock[2]])
socketOn1(null, [singleItemsMock[3]])

socketOn2(null, collectionMock)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...