Многократное получение и ожидание запроса с идентичным идентификатором, полученным до выполнения функции внутри Javascript - PullRequest
0 голосов
/ 21 апреля 2020

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

First Received Request 

{
 "ID":"4567132",
 "GroupType":"2"
 "Name":"John Chris"
 "SocialID":"68799"
 "SecurityID":"18799-er7ree-781347a-71237n"
}


Second Received Request 

{
 "ID":"4567438",
 "GroupType":"2" 
 "SocialID":"68799"
 "SecurityID":"68789-4d37er-98c5347-e05d9b"
}

I would like to get the following Expected Results combined from the First and Second. But taking into consideration other request also coming in from the api.
{
 "GroupType":"2" 
 "SocialID":"68799"
 "PublicSecurityID":"18799-er7ree-781347a-71237n"
 "PrivateSecurityID":"68789-4d37er-98c5347-e05d9b"
}

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

Вот код для получения сокета

ReceiveSocket.on("socketMessage", (returnedData) => {
    // code here       
});

Я не уверен, как логически подойти к проблеме, вы могли бы объяснить и дать решение для ее решения. Спасибо!

1 Ответ

1 голос
/ 25 апреля 2020

Что-то вроде этого:

ReceiveSocket.on('socketMessage', returnedData => {
  // objectsBySocialID always starts empty to make sure that 
  // sendRequest() only receieves new data. Notice that all previous 
  // data was already handled when it arrived, just like the 
  // current batch of data is being handled now.
  const objectsBySocialID = {};

  returnedData.forEach(obj => {
    // If there's already one or more objects with the SocialID of the 
    // current object, then just add it to the array that contains the  
    // objects that have that SocialID.
    if (objectsBySocialID[obj.SocialID]) {
      objectsBySocialID[obj.SocialID].push(obj)
    } 
    // Otherwise, initialize the array that will contain objects with
    // this object's specific SocialID and assign it to the 
    // corresponding key.
    else {
      objectsBySocialID[obj.SocialID] = [obj]
    }

    // objectsBySocialID only contains the latest changes.
    sendRequest(objectsBySocialID);
  });
});

Используя данные из вашего примера, objectsBySocialID должно выглядеть так:

{
  '68799': [
    {
      'ID':'4567132',
      'GroupType':'2',
      'Name':'John Chris',
      'SocialID':'68799',
      'SecurityID':'18799-er7ree-781347a-71237n',
    },
    {
      'ID':'4567438',
      'GroupType':'2' ,
      'SocialID':'68799',
      'SecurityID':'68789-4d37er-98c5347-e05d9b',
    },
    {
      'GroupType':'2',
      'SocialID':'68799',
      'PublicSecurityID':'18799-er7ree-781347a-71237n',
      'PrivateSecurityID':'68789-4d37er-98c5347-e05d9b',
    },
  ],
}

и когда вы закончите сбор и Группируя данные, вы должны иметь возможность передать objectsBySocialID в качестве аргумента функции, которая имеет дело с упорядоченными данными (sendRequest() в этом примере).

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