我有一个要发送到Google Cloud的数据列表。我当前的代码如下:
const teams = ['LFC', 'MUFC', 'CFC'];
teams.forEach(team => {
fetch({
url: URL,
method: 'PUT',
body: team
});
})
这与一个team
一起使用,但是如果发送多个文件并且文件更大,则会超时。我正在发送图像而不是字符串。为了解决这个问题,我需要将数据POST
一个文件一个,然后等待前一个POST
完成,然后再发送下一个文件。谁能建议最好的方法?
值得指出的是,我对文件数量没有任何控制权 已上传。
答案 0 :(得分:6)
使用reduce
代替forEach
,而使用.then()
。
以下内容将在fetch
(acc
的累加器参数)中存储最后一个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
});
})