Racing Promises - Promise.race() and Promise.all() ES6
JS
S
JavaScriptSnippets of Promise.race() showing different scenarios including a simple race recovery algorithm. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/race *APlus Compliance Promise https://github.com/promises-aplus/promises-spec
1// Promise Blueprint JavaScript
2const operations = {};
3operations.refresh = () =>{
4 return new Promise((resolve, reject) => {
5
6 });
7}
8// Promise Blueprint Typescript
9return new Promise<boolean> ((resolve, reject) => {
10...
11})
12
13/* Concurrent Promises from single entity and array entity*/
14function seedTelemetryData(obj){
15
16 // Returns a Promise
17 const updateModel1 = id => {
18 return Model1.findByIdAndUpdate(
19 id, {
20 telemetry: 500
21 }
22 ).exec();
23 };
24
25 // Promises
26 let promiseArrayOfItems;
27 const promisePayment = Model2.findByIdAndUpdate(query, fields, {
28 multi: true
29 })
30 .exec()
31 .then((telemetry) => {
32 const itemsIds = obj.itemsIds;
33 promiseArrayOfItems = Promise.map(itemsIds, updateModel1)
34 });
35
36 return Promise.all([promisePayment, promiseArrayOfItems]);
37}
38
39// Race finished
40seedTelemetryData(myObj)
41 .then((results => {
42
43 })
44 .catch((err => {
45
46 });
47
48/* Promise Race */
49// Resolving Promises Race (db2 is fastest, so races finishes right there)
50let db1 = new Promise(resolve => setTimeout(resolve, 2000, 'DB 1.'));
51let db2 = new Promise(resolve => setTimeout(resolve, 201, 'DB 2.'));
52Promise.race([db1, db2])
53.then(val => console.log('Race complete! The fastest was:', val))
54.catch(err => console.log('Race ended because: ', err));
55
56// Resolving Promises with All (db2 is fastest but the will only resolve after all promises have finished)
57Promise.all([db1, db2]).then(values => {
58 console.log('Promise all', values); // [3, 1337, "foo"]
59});
60
61// Resolved Promises (db1 is fastest)
62let db1r = Promise.resolve('DB 1.');
63let db2r = Promise.resolve('DB 2.');
64Promise.race([db1r, db2r])
65.then(val => console.log('Resolved Race complete! The fastest was:', val))
66.catch(err => console.log('Resolved Race ended because: ', err));
67
68// Mixed Resolved, Resolving Promises and default value (default value is fastest)
69let db1m = new Promise(resolve => setTimeout(resolve, 100, 'DB 1.'));
70let defaultValue = 'Virtual DB';
71let db2m = Promise.resolve('DB 2.');
72Promise.race([db1m, defaultValue, db2m])
73.then(val => console.log('Mixed Race complete! The fastest was:', val))
74.catch(err => console.log('Mixed Race ended because: ', err));
75
76// Resolving and Rejecting Promises (rejects is the fastest, please note that Promise.race() doesn't care if the promises reject or resolve, it will always get the fastest resolving one)
77let rr1 = new Promise(resolve => setTimeout(resolve, 2000, 'DB 1.'));
78let rr2 = new Promise((resolve, reject) => setTimeout(reject, 1000, 'DB 2 TimedOut!'));
79let rr3 = new Promise(resolve => setTimeout(resolve, 4000, 'DB 3.'));
80let promisesArray = [rr1, rr2, rr3];
81Promise.race(promisesArray)
82.then(val => console.log('Resolved and Rejected Race complete! The fastest was:', val))
83.catch(err => console.log('Resolved and Rejected Race ended because: ', err));
84
85// Race with Recovery (safety car) Ignoring Rejected Promises and continuing the race
86let promisesArrayWithRecovery = promisesArray.map((p, index) => p.catch(() => {throw index;}));
87let raceWithRecovery = Promise.race(promisesArrayWithRecovery)
88.then(val => console.log('Resolved and Rejected Race complete! The fastest was:', val))
89.catch(index => {
90 console.log('Re-starting race as the Rejected Race index was: ', index);
91 let p = promisesArrayWithRecovery.splice(index, 1)[0];
92 return Promise.race(promisesArrayWithRecovery)
93})
94.then(val => console.log('Resolved after recovery: ', val))
95.catch(err => console.log('Resolved and Rejected Race ended because: ', err));
96Created on 10/26/2017