Racing Promises - Promise.race() and Promise.all() ES6

JS
S
JavaScript

Snippets 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));
96

Created on 10/26/2017