search

Home  >  Q&A  >  body text

jQuery怎么检测$.get读取接口的数据是否缓存完,缓存完再执行下一条指令怎么做?

怎么检测$.get是否获取完信息,再执行下一步

jQuery怎么检测$.get读取接口的数据是否缓存完,缓存完再执行下一条指令怎么做?

我想做个打票机系统,他是连接自己写的接口方法,先获取订单后再把订单截去分隔符,再循环给下一个$.get方法有多少条订单就循环多少个$.get方法来获取详细订单信息。

问题在于,他由于没有返回完全部订单号就执行了下列方法,查询详细订单信息顺序就错乱了,有什么办法检测他是否完全返回所有信息再执行下一条?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

function load() {

    alert('查询成功');

    $("#table1_2_3").append("<table id='table' style='font-size:14px;margin:0 auto;'></table>");

    var stime = document.getElementById("stime").value;

    var etime = document.getElementById("etime").value;

    var rid = document.getElementById("rid").value;

    var tag = document.getElementById("tag").value;

    $.get({

      type: "GET",

      url: "这是接口",

      dataType: "text",

      success: function(data) {

        data = data.substr(2, data.length - 2);

        data = data.substr(0, data.length - 2);

        var data = data.split('|*');

        var dArr = new Array;

        //查询订单号

        for (var i = 0; i < data.length; i++) {

          dArr[i] = data[i];

        }

        console.log(i);

        //查询订单详细信息

        for(var j = 0; j < dArr.length; j++){

          var dingdanhao = dArr[j];

          $.get({

            type: "get",

            url: "这是接口",

            success: function(data1) {

              var result = data1.split('|*');

              for(var k = 0; k < result.length; k++){

 

              }

              console.log(data1);

            }

          },{id: dingdanhao,tag: "0"});

        }

      }

    },{stime: stime,etime: etime,rid: rid,tag: tag,});

  };


高洛峰高洛峰3106 days ago782

reply all(2)I'll reply

  • 欧阳克

    欧阳克2016-11-12 09:52:51

    var lock = false;if(lock==false)(

    1

    2

    3

    4

    lock = true;

    $.get("demo_test.html",function(data,status){

        if(status == 'success'){

            lock = false;

    ⋯⋯
    ⋯⋯
    ⋯⋯

    1

    2

       }

    });

    )

    手机写的,希望你能看懂吧


    reply
    0
  • 三叔

    三叔2016-11-12 09:51:37

    针对此需求,你有3种解决方案:

    使用ajax的「同步」模式

    1

    2

    3

    4

    5

    6

    7

    8

    $.ajax({

        url: 'url1'

        async: false,

    });

    $.ajax({

        url: 'url2'

        async: false,

    });

    这绝对是按照先后顺序执行的

    使用jQuery的Deferred对象

    比如必须等待3个ajax请求完毕,才能执行下一个步骤

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    jQuery.when(

        $.ajax({

            url: 'url1'

        }),

        $.ajax({

            url: 'url2'

        }),

        $.ajax({

            url: 'url3'

        })

    ).done(function(data1, data2, data3){

        全部请求完毕了,

    });

    当然了,大部分都是循环来弄的,于是我们可以这样

    1

    2

    3

    4

    5

    6

    7

    8

    9

    var ajaxs = [];

    for(var i = 0; i < 10;i++)

        ajaxs.push($.ajax({url: ....}));

         

    jQuery.when.apply(this, ajaxs).done(function(){

        var args = arguments;

        //args是所有得到的data

     

    });

    使用邪恶金字塔(Pyramid of Doom)

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    var urls = [

        'url1',

        'url2',

        'url3'

    ], datas = [];

    var currentIndex = -1;

    var successCallback = function(data) {

        if (data !== false) datas.push(data);

        if (++currentIndex >= urls.length) //已经循环完毕

        {

            // 已经做完了, 需要接下来干嘛?

            // datas

            return false;

        }

         

        $.ajax({

            url: urls[currentIndex],

            success: successCallback,

        });

    }

    //第一次时 手动调用

    successCallback(false);

    看你哪个能理解就用哪个吧,以上代码都是伪代码,需要自己修改后运行

    reply
    0
  • Cancelreply