Soy muy nuevo en Javascript y estoy tratando de utilizar la API de BestBuy para obtener datos en un número de SKU específico cada 3 segundos.
La llamada a la API funciona como se esperaba por sí sola, pero cuando muevo la llamada dentro de un ciclo while, no obtengo nada y no se activa la función console.log en la función.
No estoy seguro de adónde ir desde aquí y estoy empezando a preguntarme si esta llamada API solo se puede llamar por sí misma.
Agradecería cualquier ayuda.
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); }Sus bucles while bloquean constantemente el hilo, por lo que su función de devolución de llamada no se puede ejecutar.
En lugar de los bucles while, puede usar un intervalo:
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);Incluso el limpiador puede estar usando async/await para esperar 3 segundos después de recibir cada respuesta:
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();Hay varios puntos para mejorar su código:
condition == false , simplemente marque !conditionif(!condition){x = false} , simplemente haz x = !condition 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);