等待一个提取完成,然后再开始下一个

时间:2019-10-21 18:59:32

标签: javascript ajax ecmascript-6 fetch

我有一个要发送到Google Cloud的数据列表。我当前的代码如下:

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

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

这与一个team一起使用,但是如果发送多个文件并且文件更大,则会超时。我正在发送图像而不是字符串。为了解决这个问题,我需要将数据POST一个文件一个,然后等待前一个POST完成,然后再发送下一个文件。谁能建议最好的方法?

值得指出的是,我对文件数量没有任何控制权 已上传。

3 个答案:

答案 0 :(得分:6)

使用reduce代替forEach,而使用.then()

以下内容将在fetchacc的累加器参数)中存储最后一个reduce的承诺,并将新的fetch附加到{{1 }}侦听器,以确保前一个then已完成:

fetch

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

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

或者,如果可以的话,甚至更好,使用//Simulate fetch: const fetch = team => new Promise(rs => setTimeout(() => {rs();console.log(team)}, 1000)) const teams = ['LFC', 'MUFC', 'CFC']; teams.reduce((acc, team) => { return acc.then(() => { return fetch({ url: URL, method: 'PUT', body: team }); }) }, Promise.resolve()) .then(() => console.log("Everything's finished")) .catch(err => console.error("Something failed:", err))(更具可读性):

async/await

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

async function upload(teams){
  for(const team of teams){
    await fetch({
      url: URL,
      method: 'PUT',
      body: team
    });
  }
}

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

答案 1 :(得分:4)

您可以将async / await与for ... of循环一起使用。每个调用都会“保持”循环,直到完成为止,然后循环将继续下一个调用:

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

async function send(teams) {
  for (const team of teams) {
    await fetch({
      url: URL,
      method: 'PUT',
      body: team
    });
  }
}

答案 2 :(得分:0)

您可以使用async / await,如下所示:

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

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