在不使用同步Ajax的情况下使数据按顺序排列

很多时候要根据一个数组获取一组数据,但是Ajax异步导致获取数据的顺序是乱的。

最简单的方法当然是在数据里加上它的编号,然后直接根据数组的顺序添加数据,但这也意味着要根据数据中的编号遍历数组来找到每次得到的数组的index,然后根据此index添加数据。

想要异步获取数据又保证数据的顺序,显然不能用push。

而forEach等数组遍历的callback的第二个参数是index,这样就可以用数组索引的方式来确保顺序。

data.musics.forEach(function (songid, index) {
                            $http({
                                url: myConstant.sqlUrl + "/songinfo/" + songid + "?time=" +(+new Date()),
                                method: "GET",
                                withCredentials: true
                            }).success(function (data) {
                                $scope.currentList.songs[index] = data.data;
                            });
                        });

这个代码其实是不安全的。

第一,在ES5或者更老版本里,由于forEach循环很快结束,而数据获取却要慢得多,所以会出现所有数据都放到了最后一个index上互相覆盖。

这里可以用闭包解决:

data.musics.forEach(function (songid, index) {             (function(_index){
                           $http({
                                url: myConstant.sqlUrl + "/songinfo/" + songid + "?time=" +(+new Date()),
                                method: "GET",
                                withCredentials: true
                            }).success(function (data) {
                                $scope.currentList.songs[_index] = data.data;
                            });            })(index); });

问题还没有完

第二,如果快速多次获取数据,在第一次数据还没有获取完成的时候进行第二次获取,则第一次的回调函数在第二次获取数据的时候执行,就会导致第一次的数据掺杂进第二次的数据。

这就需要一个标记量来标记此时此刻获取的数据,是否应该被添加。

我选择用时间戳:

let $scope.time = +new Date();

getData($scope.time);// 此时传入的数据必须是简单数据形式,否则会被解释为指针,内部获得的数据并不能保持不变.// 还是那句话,不论是闭包还是函数,如果想要传入的参数不变,就要避免将其指针暴露在外部.// ES6解决了变量作用域带来的数据混乱,但JS的参数传递形式还是一样的,指针的暴露依然会带来危险.

function getData(time){
  data.musics.forEach(function (songid, index) {              (function(_index){
                             $http({
                                  url: myConstant.sqlUrl + "/songinfo/" + songid + "?time=" +(+new Date()),
                                  method: "GET",
                                  withCredentials: true
                              }).success(function (data) {                    if ($scope.time == time) {                         $scope.currentList.songs[_index] = data.data;                      }                  });
              })(index);   });
}                            
时间: 2024-08-08 17:49:23

在不使用同步Ajax的情况下使数据按顺序排列的相关文章

ajax实时获取下拉数据

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> ajax实时获取下拉数据</pre> <style><!-- .input_s{ position:relative} .input_s ul{ list-style:none; margin:0; padding:0; width:200px; border:1px solid #cc

服务器上的Mysql表全丢了情况下恢复数据

任务: web项目是在linux的Tomcat部署,Mysql也在上面,不知明原因下数据库宕机,启动不了,数据库表也突然没了,全空了!!!!!!!! mysql安装目录 惊喜的发现var/目录下有类似丢失数据库的表 接下来就是怎么恢复进去了,首先我们用的是mysql的InnoDb引擎,找了下其资料: 两种类型最主要的差别就是Innodb 支持事务处理与外键和行级锁.而MyISAM不支持.所以MyISAM往往就容易被人认为只适合在小项目中使用. 我作为使用MySQL的用户角度出发,Innodb和M

App开发如何利用Fidder,在api接口还没有实现的情况下模拟数据,继续开发

相信app开发很多时候,都是等后台出接口,拿到数据调试错误.殊不知,我们完全可以不用等,只要有约定好的接口定义文档,借助工具就能做到,自己模拟数据返回~      下面主要是在项目组开发过程中,使用Fidder,摸索总结的经验之谈.     一.初步介绍及前期准备 1.抓包工具简介 抓包工具有很多,以下列一下最常用的几个工具别简单介绍下 firebug:web最常用的调试工具,但是对于分析http请求的详细信息,不够强大.模拟http请求的功能也不够,且firebug常常是需要“无刷新修改”,如

无备份有完全归档日志情况下恢复数据文件

如果一个数据文件创建时到当前所有的归档日志都存在的话,那么可以通过offline datafile,recover datafile,online datafile的方式直接恢复数据文件,此种恢复属于介质恢复. 下面我们做一个实验: 查看当前所有的归档日志的初始scn以及终止scn:(status 为 A 表示available,D表示已删除) SQL> col name for a100 SQL> select sequence#,name,first_change#,next_change

实战基础技能(10)--------如何在不影响数据库的正常使用的情况下得到数据的完整.mdf和.ldf文件

一:完整备份数据库 二:还原数据库 四:分离数据库即可得到.mdf和.ldf文件

什么情况下使用large training data会非常有效

收集大量的数据可能比算法的优劣更重要 Banko和Brill在2001年做了一个研究,是关于在句子中对易混单词进行识别,画出了上图的右边的那个图,这个图显示了对于不同的算法,它们的表现相似,但是随着training set size的增加,不同的算法的性能都增加.这个说明了一个较劣势的算法,如果它有大量的数据的话,在这个例子中,它的表现会对优秀的算法只有少量的数据要好.了解到这个情况,我们就知道了,在特定的情况下(数据量的提升对改进算法有效),我们应该把精力放在收集大量的数据上,而不是用来选择某

AlwaysOn 同步提交模式是否会丢失数据?

最近朋友去恒大面试,考官给出这样一个观点: 同步情况下丢失数据有两种情况:一种是阻塞丢失,一种是同步失败. 给出的处理办法:阻塞丢失的话干掉阻塞进程,或者重启实例都能解决:同步失败就只能重做节点. 让我们一起来理解下,微软官方对于AlwaysOn同步提交模式的理解,当然直接看英文原文理解更精准: https://docs.microsoft.com/en-us/sql/database-engine/availability-groups/windows/availability-modes-a

微服务架构下静态数据通用缓存机制

在分布式系统中,特别是最近很火的微服务架构下,有没有或者能不能总结出一个业务静态数据的通用缓存处理机制或方案,这篇文章将结合一些实际的研发经验,尝试理清其中存在的关键问题以及探寻通用的解决之道. 什么是静态数据 这里静态数据是指不经常发生变化或者变化频率比较低的数据,比如车型库.用户基本信息.车辆基本信息等,车型库这种可能每个月会更新一次,用户和车辆基本信息的变化来源于用户注册.修改,这个操作的频率相对也是比较低的. 另外这类数据的另一个特点是要求准确率和实时性都比较高,不能出现丢失.错误,以及

android 休眠状态下 后台数据上传

下面来说一下黑屏情况下传递数据: 要实现程序退出之后,仍然可以传递数据,请求网络,必须采用service,service可以保持在后台一直运行,除非系统资源极其匮乏,否则一般来说service是不会被系统杀死的. 开启一个server 然后在 server 的  onStart 方法中设置 @Override public void onStart(Intent intent, int startId) { // TODO Auto-generated method stub super.onS