如果使用API ,我的if语句如何对流数据做出反应

问题描述 投票:0回答:1

例如,假设我正在使用拍卖API。我有一个订阅功能,可以用来获取有关潜在买家姓名及其相应出价的实时数据。

当订阅频道(auctionAPI.subscribe)上发生很多事情时,我很难让函数只能在“ if statements”内部执行一次。

如果名称Mike在短时间内出现两次,则第一个“如果陈述”将执行两次。我了解,当API发送数据时,我放置在auctionAPI.subscribe中的所有代码都将执行,但是为什么原始布尔值不起作用?

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
    }
  }

});
javascript node.js api if-statement boolean-logic
1个回答
0
投票

目前的示例代码似乎应该可以正常工作。我要提请注意的是,您不会在订阅处理程序内部的任何地方错误地用“ let”重新定义“ value”,因为这实际上会重新定义范围并导致其不影响外部“ value”。

我知道这不是被问到的,但是如果要限制呼叫的处理,则可以这样做。每个“名称”将限制每500ms最多处理一次呼叫(希望这是唯一键)

//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(() => {
        doSomething(scheduled[data.Name].data);
        delete scheduled[data.Name];
      }, 500)
    };
  }
}

auctionAPI.subscribe(throttleByName);
© www.soinside.com 2019 - 2024. All rights reserved.