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
相关产品推荐
相关产品推荐

