Как мой if if реагирует на потоковые данные при использовании API - PullRequest
0 голосов
/ 21 апреля 2020

Допустим, например, я работаю с API аукциона. У меня есть функция подписки, которую я могу использовать для получения в реальном времени данных об имени потенциальных покупателей и их соответствующих ставках.

Мне трудно получить функции, которые выполняются только один раз внутри "if statments", когда есть много происходит на канале подписки (auctionAPI.subscribe).

Если имя Майк появляется в течение короткого промежутка времени дважды, первый «if statment» выполняется дважды. Я понимаю, что весь код, который я поместил в auctionAPI.subscribe, будет выполняться, когда API отправляет данные, но почему примитивные логические значения не работают?

let value = 1;

auctionAPI.subscribe((data) => {

  if (value === 1) {
    if (data.Name == "Mike" && data.price >= 300) {
      //do something
      value = 2
    }
  }
  if (value === 2) {
    if (data.Name == "Charlotte" && data.price >= 1000) {
      //do something
      value = 3
    }
  }

});

1 Ответ

0 голосов
/ 21 апреля 2020

Пример кода в его нынешнем виде кажется, что он должен работать нормально. Я бы сказал, что будьте осторожны, что вы не ошибочно переопределяете 'value' с помощью 'let' где-нибудь внутри обработчика подписки, так как это на самом деле изменяет область действия и не будет влиять на внешнее 'value'.

Я знаю, что это не совсем то, о чем спрашивали, но если вы пытаетесь ограничить обработку вызовов, то как-то так будет. Это будет ограничивать обработку вызовов максимум один раз каждые 500 мс на «Имя» (возможно, это уникальный ключ)

//Just some setup code to call the delegate
let auctionAPI = {
    subscribe: (delegate) => {
    //Quick subsequent calls
    delegate({ Name: 'A Name', price: 100 });
    delegate({ Name: 'A Name', price: 300 });
    delegate({ Name: 'A Name', price: 200 });
    setTimeout(() => {
        //Wait a second and quick subsequent calls
        delegate({ Name: 'A Name', price: 600 });
        delegate({ Name: 'A Name', price: 500 });
        delegate({ Name: 'A Name', price: 300 });
    }, 1000);
  }
};

function doSomething(data) {
  //Where you want to acutally do the real logic with the throttled calls
  console.log(`Do something with ${JSON.stringify(data)}`);
}

let scheduled = {};
function throttleByName (data) {
  if (scheduled[data.Name]) {
    //Already scheduled to process
    //-Make sure to use the latest data
    //-Could be modified to keep the larger value
    scheduled[data.Name].data = data;
  } else {
    scheduled[data.Name] = {
      data: data,
      timerId: setTimeout(() => {
        let scheduledData = scheduled[data.Name].data;
        delete scheduled[data.Name];
        doSomething(scheduledData);
      }, 500)
    };
  }
}

auctionAPI.subscribe(throttleByName);
...