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);
我是 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);