js中for循环里面有异步请求怎么解决?

发布于 2022-09-05 10:51:14 字数 833 浏览 18 评论 0

        axios.post('/operationlog/list', moduleParams).then((res) => {
            if (res.status === 200) {
              this.moduleList = res.data.items;

              stepParams.append('category', "");
              stepParams.append('needPlayback', true);

              for (let i = 0; i < this.moduleList.length; i++) {
                stepParams.set('category', this.moduleList[i].category)
                axios.post('/operationlogitem/list', stepParams).then((res) => {
                  console.log(res.data.items);
                }).catch((e) => {
                  console.log(e);
                })
              }
            }
          }

代码如上,根据外层请求获取到多个不同的category,但是for循环是同步,里面的post请求是异步的,所以始终以最后一项的category为参数发送请求.请问如何修改代码按照每一项的category参数发送post请求,目前只知道用递归解决,有没有其他办法?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

霞映澄塘 2022-09-12 10:51:14

可以用生成器函数或者async/await再用babel转

淡紫姑娘! 2022-09-12 10:51:14

可以用async/await

秋风の叶未落 2022-09-12 10:51:14

其实是闭包问题,也可以使用async/await来解决

浊酒尽余欢 2022-09-12 10:51:14

闭包问题,简单解决.

for (let i = 0; i < this.moduleList.length; i++) {
  (function(cur) {
      stepParams.set('category', this.moduleList[cur].category)
      axios.post('/operationlogitem/list', stepParams).then((res) => {
        console.log(res.data.items);
      }).catch((e) => {
        console.log(e);
      })
  })
}

但是let关键字应该就能避免这个问题了

苏别ゝ 2022-09-12 10:51:14

参照:
https://www.cnblogs.com/CoderMonkie/p/js-async-in-loop.html


// 循环中调用异步
let arr = []
new Promise((res, rej) => {
    for (let index = 0; index < 5; index++) {
        new Promise((resolve, reject) => {
            resolve(index)
        })
        .then((i) => {
            arr.push(index)
        })
    }
    res()
}).then(() => {
    console.log(arr)
})


// -----

// async/await 版本 循环(forEach)中调用异步
async function processArray(array) {
    if(toString.call(array) != '[object Array]'){
        console.log(array)
        return
    }
    array.forEach(async (item) => {
        await processArray(item);
    })
    console.log('Done!');
}
processArray(['a', 'b', 'c'])

// 结果:像同步一样的预期结果
// a
// b
// c
// Done!
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文