You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

BestBuy API无法在while循环中正常执行查询的问题求助

问题根源
  • JavaScript为单线程事件驱动运行模型,所有异步任务(例如API请求对应的Promise回调)必须等待主线程的同步任务全部执行完毕后,才会被调度执行
  • 你自定义的wait属于同步阻塞函数,会持续占用主线程资源,导致bby.products的.then回调永远没有执行机会,isSoldOut变量永远不会被修改,程序进入死循环
  • 原逻辑下while循环会连续批量触发API请求,而非每3秒触发一次,大概率会触发BestBuy的API限流规则
修复后的代码
const bby = require('bestbuy')('<你的BestBuy API密钥>');

// 封装非阻塞的异步等待函数
function wait(ms) {
  return new Promise(resolve => setTimeout(resolve, ms));
}

// 用async函数封装监控逻辑
async function monitorProduct(sku) {
  let isSoldOut = true;
  while(isSoldOut) {
    console.log("发起商品查询请求");
    try {
      const data = await bby.products(sku, {
        show: 'sku,name,salePrice,onlineAvailability,inStorePickup,onlineAvailabilityUpdateDate'
      });
      console.log(data);
      if (!data.onlineAvailability) {
        isSoldOut = false;
        console.log('商品已售罄,停止监控');
      } else {
        console.log('商品仍在售,3秒后再次查询');
        await wait(3000);
      }
    } catch (err) {
      // 捕获请求异常,避免网络波动、API限流等问题导致程序直接崩溃
      console.error('查询请求出错:', err);
      await wait(3000);
    }
  }
}

// 启动监控,传入目标SKU编号
monitorProduct(6465789);
注意事项
  • 异步等待逻辑不会占用主线程,API返回结果可以正常被处理
  • 严格控制请求频率为每3秒一次,避免触发BestBuy的API频率限制导致密钥被临时封禁
  • 若不需要持续监控到商品售罄,也可以用setInterval实现固定间隔查询,符合停止条件后调用clearInterval终止定时器即可

内容的提问来源于stack exchange,提问作者Pombi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 16:15:03