javascript异步提取功能

时间:2020-08-05 18:16:49

标签: javascript async-await fetch

我正在尝试创建一个递归函数,该函数为给定数组的每个整数发送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()});
  }
}

1 个答案:

答案 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