BestBuy API 不会循环查询

BestBuy API won't query in a loop

我是 Javascript 的新手,我正在尝试利用 BestBuy 的 api 每 3 秒获取一次特定 sku 编号的数据。

对 api 的调用本身按预期工作,但是当我将调用移动到 while 循环内时,我什么也没得到,函数中的 console.log 也没有命中。

不知道从这里去哪里,我开始怀疑这个 api 调用是否只能自己调用​​。

非常感谢任何帮助。

var bby = require('bestbuy')('<Actual BestBuy Api key in original code>');

var isSoldOut = true;

while(isSoldOut)
{
  console.log("HERE");
  bby.products(6465789,{show:'sku,name,salePrice,onlineAvailability,inStorePickup,onlineAvailabilityUpdateDate'}).then(function(data){
    console.log(data);

    if (data['onlineAvailability'] == false)
    {
    isSoldOut = false;
    console.log(isSoldOut);
    }
  });
  
  wait(3000);
}

function wait(ms)
{
    var d = new Date();
    var d2 = null;
    do { d2 = new Date(); }
    while(d2-d < ms);
}

您的 while 循环不断阻塞线程,因此您的回调函数不能 运行。

您可以使用间隔代替 while 循环:

var bby = require('bestbuy')('<Actual BestBuy Api key in original code>');

function check() {
  console.log("HERE");
  bby.products(6465789,{show:'sku,name,salePrice,onlineAvailability,inStorePickup,onlineAvailabilityUpdateDate'}).then(function(data){
    console.log(data);

    if (data['onlineAvailability'] == false)
    {
      clearInterval(loop);
      console.log("In Stock");
    }
  });
}

const loop = setInterval(check, 3000);

甚至清洁工也可能使用 async/await 在收到每个响应后等待 3 秒:

var bby = require('bestbuy')('<Actual BestBuy Api key in original code>');

const wait = require('util').promisify(setTimeout);

async function check() {
  console.log("HERE");

  const data = await bby.products(6465789,{show:'sku,name,salePrice,onlineAvailability,inStorePickup,onlineAvailabilityUpdateDate'});
  console.log(data);

  if (data['onlineAvailability'] == false)
  {
    console.log("In Stock");
    return;
  }

  await wait(3000);
}

check();

有几点可以改进您的代码:

  • 使用setInterval定期执行代码,而不是在while循环中使用自旋锁
  • 使用async/await提高可读性
  • 而不是检查 condition == false,只需检查 !condition
  • 不用if(!condition){x = false},只需x = !condition
  • 如果 属性 名称不可变,请使用点表示法而不是括号表示法来访问对象 属性。如果正确记录了对象形状并减少错字,这可以利用 IDE 的智能感知。

const t = setInterval(async () =>{
    const data = await bby.products(6465789, { show: 'sku,name,salePrice,onlineAvailability,inStorePickup,onlineAvailabilityUpdateDate' });
    console.log(data);
    isSoldOut = !data.onlineAvailability;
    console.log(isSoldOut);
    if(isSoldOut)
    {
        clearInterval(t);
    }
},3000);