-1

我对 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);
}
4

2 回答 2

0

您的 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();
于 2021-12-06T01:42:40.460 回答
0

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

  • 使用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);
于 2021-12-06T01:47:09.350 回答