Omair Nabiel
Omair Nabiel

Reputation: 1682

async/await Promise.all() but get response as the promises resolve

Run all promises in parallel using Promise.all() but get response of each promise as it resolves and do processing on that.

Is there a work around like I can attach a callback to promises.resolve that as a certain promise resolves it calls a callback

Example

let p1 = Promise.resolve(1)
let p2 = Promise.resolve(2)
let p3 = Promise.resolve(3)

Promise.all([p1,p2,p3])

function processData(data)
{
.... 
}

I want to run all of them in parallel but don't want to wait till all of them get resolved but instead call processData() as soon as a promise resolves for each of them.

Upvotes: 0

Views: 576

Answers (3)

slebetman
slebetman

Reputation: 113866

Just don't use Promise.all():

let p1 = Promise.resolve(1).then(processData);
let p2 = Promise.resolve(2).then(processData);
let p3 = Promise.resolve(3).then(processData);

If you need to call processData as soon as a promise resolves but want to wait for all promises to resolve before continuing then use Promise.all() only for the wait but call processData inside each promise's .then():

(async () {
  let p1 = Promise.resolve(1).then(processData);
  let p2 = Promise.resolve(2).then(processData);
  let p3 = Promise.resolve(3).then(processData);

  await Promise.all([p1,p2,p3]);

  // continue processing..

})();

Upvotes: 1

Abana Clara
Abana Clara

Reputation: 4650

You can attach a .then after resolving and assign processData as a callback.

let p1 = Promise.resolve(1).then(processData);
let p2 = Promise.resolve(1).then(processData);
let p3 = Promise.resolve(1).then(processData);

Promise.all([p1,p2,p3])

Upvotes: 2

CertainPerformance
CertainPerformance

Reputation: 370639

Iterate over the promises with forEach instead, attaching processData to each in a .then:

const processData = console.log;

let p1 = Promise.resolve(1);
let p2 = Promise.resolve(2);
let p3 = Promise.resolve(3);
[p1, p2, p3].forEach(prom => prom
  .then(processData)
  .catch((err) => {
    /* handle errors */
  })
);

Upvotes: 2

Related Questions