I'm basically just trying to verify if a resource is reachable from the executing client. I can not use XHR
, because the target resource doesn't allow that.
I'm pretty new to JS and am currently working with this ( executable here ):
var done = false;
var i = 1;
var t = "https://i.stack.imgur.com/Ya15i.jpg";
while(!done && i < 4)
{
console.log("try "+i);
done = chk(t);
sleep(1000);
i = i+1;
if (done)
{
console.log("Reachable!");
break;
}
else
{
console.log("Unreachable.");
}
}
function chk(target)
{
console.log("checking "+target)
fetch(target, {mode: 'no-cors'}).then(r=>{
return true;
})
.catch(e=>{
return false;
});
}
// busy fake sleep
function sleep(s)
{
var now = new Date().getTime();
while(new Date().getTime() < now + s){ /* busy sleep */ }
}
I was expecting this code to check for the resource, print the result, then wait for a sec. Repeat this until 3 tries were unsuccessful or one of them was successful.
Instead the execution blocks for a while, then prints all of the console.logs
at once and the resource is never reachable (which it is).
I do know that the fetch
operation is asynchronous, but I figured if I previously declare done
and implement a sleep it should work. In the worst case, the while loop would use the previously declared done
.
How do I achieve the described behavior? Any advice is welcome.
The main problem is that you are trying to return from callback. That makes no sense. But
fetch
is Promise based request you can use Promise to simulate delays as wellSomething like this should do the trick
Your
sleep
function is blocking, what you really want is a recursive function that returns a promise after checking the urln
times with a delay ofy
seconds etc.Something like this
To be used like this
And note that this does not fail on 404 or 500, any response is a successful request.
Try this, Hope it works
You can't return within a callback. When you do, it is the callback that is returning, not the parent function. If fact, the function
chk
is never returning anything.What it sounds like you are intending to do is return the promise returned by fetch. And attempt to fetch three times.
Try this:
Your chk function returns undefined, you return true/false from promise callbacks not from container function.
You should use recursion and timeout in catch callback. It will be something like this: