Skip to content Skip to sidebar Skip to footer

Wait For One Fetch To Finish Before Starting The Next

I have a list of data that I am sending to google cloud. My current code looks like this: const teams = ['LFC', 'MUFC', 'CFC']; teams.forEach(team => { fetch({ url: U

Solution 1:

Use a reduce instead of forEach, with .then().

The following will store the promise of the last fetch in acc (the accumulator parameter of reduce), and appends the new fetch inside of a then listener, to ensure that the previous fetch is finished:

const teams = ['LFC', 'MUFC', 'CFC'];

teams.reduce((acc, team) => {
  return acc.then(() => {
    returnfetch({
      url: URL,
      method: 'PUT',
      body: team
    });
  })
}, Promise.resolve())
  .then(() =>console.log("Everything's finished"))
  .catch(err =>console.error("Something failed:", err))

//Simulate fetch:constfetch = team => newPromise(rs =>setTimeout(() => {rs();console.log(team)}, 1000))

const teams = ['LFC', 'MUFC', 'CFC'];

teams.reduce((acc, team) => {
  return acc.then(() => {
    returnfetch({
      url: URL,
      method: 'PUT',
      body: team
    });
  })
}, Promise.resolve())
  .then(() =>console.log("Everything's finished"))
  .catch(err =>console.error("Something failed:", err))

You can even write a general helper function for it:

const teams = ['LFC', 'MUFC', 'CFC'];

constpromiseSeries = cb => teams.reduce((acc, elem) => acc.then(() =>cb(elem)), Promise.resolve())

promiseSeries((team) => {
  returnfetch({
    url: URL,
    method: 'PUT',
    body: team
  })
})
  .then(() =>console.log("Everything's finished"))
  .catch(err =>console.error("Something failed:", err))

//Simulate fetch:constfetch = team => newPromise(rs =>setTimeout(() => {rs();console.log(team)}, 1000))

const teams = ['LFC', 'MUFC', 'CFC'];

constpromiseSeries = cb => teams.reduce((acc, elem) => acc.then(() =>cb(elem)), Promise.resolve())

promiseSeries((team) => {
  returnfetch({
    url: URL,
    method: 'PUT',
    body: team
  })
})
  .then(() =>console.log("Everything's finished"))
  .catch(err =>console.error("Something failed:", err))

Or, even better, if you can (it's ES2017), use async/await (it's more readable):

const teams = ['LFC', 'MUFC', 'CFC'];

asyncfunctionupload(teams){
  for(const team of teams){
    awaitfetch({
      url: URL,
      method: 'PUT',
      body: team
    });
  }
}

upload(teams)
  .then(() =>console.log("Everything's finished"))
  .catch(err =>console.error("Something failed:", err))

//Simulate fetch:constfetch = team => newPromise(rs =>setTimeout(() => {rs();console.log(team)}, 1000))

const teams = ['LFC', 'MUFC', 'CFC'];

asyncfunctionupload(teams) {
  for (const team of teams) {
    awaitfetch({
      url: URL,
      method: 'PUT',
      body: team
    });
  }
}

upload(teams)
  .then(() =>console.log("Everything's finished"))
  .catch(err =>console.error("Something failed:", err))

Solution 2:

You can use async/await with a for...of loop. Each call will "hold" the loop, until it's done, and then the loop will continue the next call:

const teams = ['LFC', 'MUFC', 'CFC'];

asyncfunctionsend(teams) {
  for (const team of teams) {
    awaitfetch({
      url: URL,
      method: 'PUT',
      body: team
    });
  }
}

Solution 3:

You can make use of async/await, as follows:

const teams = ['LFC', 'MUFC', 'CFC'];

teams.forEach(async (team) => {
    await fetch({
      url: URL,
      method: 'PUT',
      body: team
    });
})

Post a Comment for "Wait For One Fetch To Finish Before Starting The Next"