javascript - 如何在js的for循环中,顺序执行异步请求。
PHPz
PHPz 2017-04-11 12:57:46
[JavaScript讨论组]

console.log(index)的时候 并不是按照顺序执行的 怎么变成顺序的

PHPz
PHPz

学习是最好的投资!

全部回复(4)
迷茫

好问题!

首先,对于连续发送HTTP请求返回的肯定是很难保证顺序,因为一个请求的成功有很多因素会被影响响应的时间。

当然,最简单的还是需要让异步同时完成以后,再统一通知。

大概步骤应该是:

  1. 所有HTTP请求都以 Promise 对象返回。

  2. 使用 Promise.all() 将将多个Promise实例,包装成一个新的Promise实例。

  3. 根据数据进行处理。

那么大概的代码差不多会是这样子:

function getInfo(info, index) {
  return new Promise((resolve, reject) => {
    // 使用settimeout模拟请求
    const ms = 1000 * Math.ceil(Math.random() * 3);
    setTimeout(() => {
      // get(info).save().then(data => { resolve(index); })
      resolve(index);
    }, ms);
    console.log(`${index} time: ${ms}`);
  });
}

let promises = [1, 2, 3].map((item, index) => {
  let info = {};
  return getInfo(info, index);
});

Promise.all(promises).then((allData) => {
  console.log(allData);
  // [0, 1, 2]
}).catch((err) => {
  console.log(err);
})
高洛峰

1.下次不要贴图片,贴代码方便他人修改。
2.不妨试试类似于操作系统多进程的实现方法:wait(signal),配合闭包,在callback里面加个无限循环直到顺序匹配执行后面的语句。
3.同步请求或许可以替代异步。
4.有这个需求的时候不妨回头看看代码是否需要重构以求更好的解决方案。

阿神

利用回调加递归吧,在回调函数里判断当前的index是否到达上限,是的话停止,否的话继续传入index+1参数执行 。

PHPz

既然如此就用同步请求好了。。

或者用个队列,不知道JS有没有类似的框架,iOS的网络操作框架有这样的功能。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号