Quiero que mi ciclo while coincida con 2 condiciones para romper el ciclo: la res NO debe estar indefinida, que es el caso solo cuando el código de estado es 200, y obj.owner debe ser igual a algún valor que configuré. El propietario de esa página tarda un par de segundos en actualizarse, por lo que necesito que se ejecute el ciclo while hasta que el propietario actualice.
Aquí está la función de solicitud
const getOwner = () => { const opts = { url: 'https://example.com', json: true, simple: false, resolveWithFullResponse: true } return request(opts) .then(res => { if (res.statusCode == 200) { const obj = { owner: res.body.owner } return obj } else { console.error(`Error: ${res.statusCode}`) } }) .catch(e => { console.error(`Panic: ` + e.message) }) }Y aquí está el ciclo while
let owner = await getOwner() while (!owner && owner.owner != 'some value') { owner = await getOwner() } console.log('Loop broken') Cuando console.log(!owner, (owner.owner != 'some value')) después de la primera llamada a la función, antes de intentar ingresar al ciclo, devuelve false para la primera condición y true para la segunda.
Cuando el código de estado es distinto de 200, no devuelve el objeto, por lo que necesito esas 2 condiciones juntas, de lo contrario, el programa falla debido a que el owner no está definido.
Ahora, cuando ejecuto esto, siempre salta el ciclo sin importar qué, realmente estoy perdido en este punto.
En mi opinión, es una mala idea recorrer un recurso hasta obtener el resultado deseado.
Si tiene control sobre el recurso que está llamando, cámbielo para devolver el resultado de acuerdo con sus expectativas.
Si no tiene control sobre el recurso, en mi opinión, el recurso no debería devolver resultados diferentes en llamadas diferentes. Si obtiene una respuesta diferente en cada llamada, entonces el recurso no es idempotente. Es un mal diseño. Imagínese, estaría repitiendo n veces, con eso puede o no obtener los resultados que está buscando.
Sugeriría investigar la implementación y solucionar la raíz del problema, en lugar de solucionarlo.
getOwner devuelve una Promise . Tendrás que await por ello. Y no creo que realmente necesites el bucle while :
let owner = await getOwner(); if(owner && owner.owner != 'some value') { /*do stuff with owner*/ } console.log(owner);