adm0xlan
adm0xlan

Reputation: 51

While loop with 2 conditions not working as expected

I want my while loop to match 2 conditions in order to break the loop - res has to NOT be undefined, which is the case only when status code is 200, and obj.owner has to be equal to some value i set. It takes a couple of seconds for the owner on that page to update, so i need the while loop to run until the owner updates.

Here's the request function

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)
    })
}

And here's the while loop

let owner = await getOwner()
while (!owner && owner.owner != 'some value') {
  owner = await getOwner()
}

console.log('Loop broken')

When I console.log(!owner, (owner.owner != 'some value')) after the first function call, before trying to enter into the loop, it returns false for the first condition, and true for the second.

When status code is other than 200, it doesnt return the object, so i need those 2 conditions together, as otherwise it crashes the program due to owner being undefined.

Now, when i execute this, it always skips the loop no matter what, im really lost at this point.

Upvotes: 0

Views: 109

Answers (2)

Manjunath Reddy
Manjunath Reddy

Reputation: 1197

In my opinion, it's a bad idea to loop through a resource until you get the intended result you are seeking.

If you have control over the resource that you are calling, change it to return the result according to your expectation.

If you do not have control over the resource, in my opinion, the resource should not be return different results on different calls. If you get a different response on each call, then the resource is not idempotent. It's a bad design. Imagine, you would be looping n times, with that you may or may not get the results you are looking for.

I would suggest looking into implementation and fixing the root of the problem, rather than work around.

Upvotes: 1

Hanchen Jiang
Hanchen Jiang

Reputation: 2682

getOwner returns a Promise. You will need to await for it. And I don't think you really need the while loop:

let owner = await getOwner();
if(owner && owner.owner != 'some value') {
  /*do stuff with owner*/
}
console.log(owner);

Upvotes: 0

Related Questions