为了账号安全,请及时绑定邮箱和手机立即绑定

javascript 异步获取函数

javascript 异步获取函数

元芳怎么了 2022-12-22 15:14:47
我正在尝试创建一个递归函数,它为给定数组的每个整数发送 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 回答

?
GCT1015

TA贡献1827条经验 获得超4个赞

这是异步 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可以在这里找到


查看完整回答
反对 回复 2022-12-22
  • 1 回答
  • 0 关注
  • 115 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号