我正在尝试创建一个递归函数,该函数为给定数组的每个整数发送PUT请求,并在其末尾调用另一个函数。
function fetchArchive(arr,state,mailbox){
if(arr.length == 0){
load_mailbox(mailbox)
}
for(i of arr){
fetch(`/emails/${arr.shift()}`, {
method: 'PUT',
body: JSON.stringify({
archived: state
})
})
.then(fetchArchive(arr,state,mailbox))
}
}
但是似乎它在获取数组的最后一项之前调用了load_mailbox()
函数。
我知道应该使用async / await
更好地实现这一点。有人可以举一个例子来帮助我理解吗?
更新: 事实证明,下面的代码可以正常工作
async function fetchArchive(a,s,callback){
for(i of a){
await fetch(`/emails/${i}`, {
method: 'PUT',
body: JSON.stringify({
archived: s
})
})
// if i is the last item, load mailbox
.then(() => { if(i==a[a.length-1] && callback) callback()});
}
}
答案 0 :(得分:1)
这是异步for..of循环的正确代码
async function fetchArchive(arr,state,mailbox){
console.log(1)
if(arr.length === 0){
load_mailbox(mailbox)
}
for await (const elem of arr){
await fetch2(elem);
arr.shift();
console.log({ elem })
fetchArchive(arr,state,mailbox)
}
}
但是,此代码不起作用,并导致无限递归:)
我认为在迭代过程中对数组进行变异是一个坏主意。
另外,请记住,then
会收到回调。
因此,then
的适当参数是:
.then(response=>fetchArchive(respone))
在您的情况下,您无法将fetchArchive
作为参数传递给then
方法,因为fetchArchive
不返回函数
[更新]
这是具有数组索引比较的工作代码:
const fetchArchive = async (a, s, callback) => {
for (const [index, value] of a.entries()) {
await fetch(index)
// if i is the last item, load mailbox
.then(() => {
if (index == a.length - 1 && callback) {
callback();
}
});
}
};
关于entries
U的文档可以找到here