As far as I know, there are two options about promise
:
Ok, I know what promise.all()
does. It runs promises in parallel, and .then
gives you the values if both resolved successfully. Here is an example:
Promise.all([
$.ajax({ url: 'test1.php' }),
$.ajax({ url: 'test2.php' })
])
.then(([res1, res2]) => {
// Both requests resolved
})
.catch(error => {
// Something went wrong
});
But I don't understand what does promise.race()
is supposed to do exactly? In other word, what's the difference with not using it? Assume this:
$.ajax({
url: 'test1.php',
async: true,
success: function (data) {
// This request resolved
}
});
$.ajax({
url: 'test2.php',
async: true,
success: function (data) {
// This request resolved
}
});
See? I haven't used promise.race()
and it behaves like promise.race()
. Anyway, is there any simple and clean example to show me when exactly should I use promise.race()
?
It's a piece to build a timeout system, where:
For an example of the second, one might show a spinner "instantly" while still defaulting to show real content if it comes in fast enough. Try running the below a few times - note at least some console message comes "instantly". This might normally be attached to perform operations on a UI.
The key to note is - the result of
Promise.race
is much less important than the side effects (though, this then is a code smell).Inspiration credit to a comment by captainkovalsky.
An example of the first:
You can see from this one that the timeout's
console.log
is never executed when the timeout hits first. It should fail/succeed about half/half, for testing convenience.I've used it for request batching. We had to batch tens of thousands of records into batches for a long running execution. We could do it in parallel, but didn't want the number of pending requests to get out of hand.
Here's an easy example to understand the use of
promise.race()
:Imagine you need to fetch some data from a server and if the data takes too long to load (say 15 seconds) you want to show an error.
You would call promise.race() with two promises, the first being your ajax request and the second being a simple
setTimeout(() => resolve("ERROR"), 15000)
Let's take an sample workaround of
Promise.race
like below.You can see
race
function executes all promises, but whomever finishes first will resolve/reject with wrapperPromise
.As you see, the
race()
will return the promise instance which is firstly resolved or rejected:For a scenes to be used, maybe you want to limit the cost time of a request :
With the
race()
you just need to get the returned promise, you needn't care about which one of the promises in therace([])
firstly returned,However, without the
race
, just like your example, you need to care about which one will firstly returned, and called the callback in the bothsuccess
callback.Summary:
Promise.race
is a JS built in function that accepts an iterable of Promises (e.g.Array
) as an argument. This function then asynchronously returns a Promise as soon as one in of the Promises passed in the iterable is either resolved or rejected.Example 1:
In this example first an array of Promises is passed in
Promise.race
. Both of the promises resolve but promise1 resolves faster. Therefore the promise is resolved with the value of promise1, which is the string'Promise-one'
.Example 2:
In this second example the second promise rejects faster than the first promise can resolve. Therefore
Promise.race
will return a rejected promise with the value of'err'
which was the value that Promise2 rejected with.The key point to understand is that
Promice.race
takes an iterable of Promises and returns a Promise based on the first resolved or rejected promise in that iterable (with the correspondingresolve()
orreject()
values).