for循环中嵌套异步请求问题

快来打我* 2022-12-18 11:54 199阅读 0赞

for循环中嵌套了异步请求会导致顺序错乱

简单明了的例子:

  1. //for中嵌套异步时,执行顺序会混乱
  2. function forTest(){
  3. for(var i=0; i<5; i++){
  4. (function(j){
  5. setTimeout(function(){
  6. console.log("第"+(j+1)+"次循环");
  7. }, Math.random() * 3000);
  8. }(i));
  9. }
  10. }
  11. forTest();
  12. //第5次循环
  13. //第2次循环
  14. //第3次循环
  15. //第4次循环
  16. //第1次循环

我是在打开某个页面时就发出一个ajax请求,获取一些数据后,再用这些数据的id再次发送请求获取数据。由于获取的数据都是list,所以需要循环发送ajax请求。

前端用的Vue.js

  1. created: function () {
  2. axios.get('../../WeChatMaterial/recommendationItem/list?'+'currentPage=1')
  3. .then(function (response) {
  4. var respData = response.data;
  5. if (respData.result === 'ok') {
  6. app.user_display = respData.userDisplay;
  7. app.items = respData.data.list;
  8. app.total_page = respData.data.pages;
  9. app.current_page = respData.data.pageNum;
  10. //遍历respData.data.list中的id
  11. getGoodsList(0,app.items.length);
  12. function getGoodsList(j,length) {
  13. var id = app.items[j].id;
  14. axios.get('../../WeChatMaterial/goodsList?id=' + id)
  15. .then(function (response) {
  16. var goodsList = response.data;
  17. app.goodsList.push(goodsList);
  18. if(++j < length) {
  19. getGoodsList(j, length);
  20. }
  21. });
  22. }
  23. }
  24. });
  25. },

html:

  1. <tbody id="tableMaterial">
  2. <tr v-for="(item,index) in items">
  3. <td>{
  4. {item.id}}
  5. <span @click="jsCopy(item.id)"><img src="http://images0.zaijiawan.com/wechat/material/copy_16px_27826_easyicon.net.png@!ori"></span>
  6. </td>
  7. <td><p>{
  8. {item.name}}</p></td>
  9. <td>
  10. <div class="weChatImage">
  11. <img :src="item.img" style="width: 70px;height: auto"/>
  12. </div>
  13. </td>
  14. <td>
  15. <div class="weChatImage">
  16. <img :src="item.squareImg" style="width: 70px;height: auto"/>
  17. </div>
  18. </td>
  19. <td><p v-if="item.enablePush === 1">推文</p><p v-if="item.enablePage === 1">落地页</p>
  20. <p v-if="item.enableRectangleImg === 1">长图功能页</p></td>
  21. <td>
  22. <div><a :href="item.url" target="_blank">查看</a></div>
  23. </td>
  24. <td>
  25. <div v-for="goods in goodsList[index]" class="Ellipsis"><p>{
  26. {goods.goodsTitle}}</p></div>
  27. </td>
  28. <td><a name="edit" @click="goToEdit(item.id)">编辑</a></td>
  29. </tr>
  30. </tbody>

我个人认为在进行前后台数据交互的时候,需要特别注意一下数据的格式。

发表评论

表情:
评论列表 (有 0 条评论,199人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Java消灭嵌套for循环

    当两个列表的长度很大时,使用嵌套循环确实可能会导致效率问题。这种情况下,你可以考虑使用Java 8中的流式操作和flatMap方法来优化代码,以实现更高效的笛卡尔积计算。下面是

    相关 Java for循环嵌套

    和其他编程语言一样,[Java][] 允许循环嵌套。如果把一个循环放在另一个循环体内,那么就可以形成嵌套循环。 嵌套循环既可以是 for循环嵌套 while 循环,也

    相关 PHP的for循环嵌套问题

    [for循环的执行原理: ][for_] [for循环][for_]的参数有(初始值;判断条件;更新循环变量表达式) 三者均不是必须的,若三者不完整则必须在适当的时候手动