search

Home  >  Q&A  >  body text

javascript - 循环中的$.post()在循环结束才开始执行回调函数

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

<code class="javascript">//先上代码

 

var status = 0;               //1.先在js文件定义了一个全局变量

 

for(){                        //这里有个循环

    test(time);                   //循环体里面调用test()方法

    console.log(status);      //输出status

}

 

function test(time) {         //2执行test()

    var data = '{}';            //这些数据我没给他显示出来

    submitJsonp("post", data, url, getDetails);//把参数传到submitJsonp 调用ajax

}

 

function getDetails(res) {

    alert("1");

}

      

function submitJsonp(_type, _data, _url, _method) {        //3.执行submitJsonp()方法

    console.log(_data)

    if (_type == "get")

        $.get(_url, JSON.parse(_data), function (data, state) {

                _method(data)

            }

        )

    else {

        $.post(_url, JSON.parse(_data), function (data, state) {  

        //4.方法执行这的时候就跳过去了, 直接去执行for循环里面的console.log(status);   

        //下面的_method(data)都还没调用,因此没进入getDetails()方法。

        //等循环完了,才开始执行getDetails()方法,一样执行7遍

        //以前也是调用submitJsonp这个方法的,可能是没有在循环中执行过,没遇到这种情况

        //求帮忙。。。

                alert("1");

                _method(data);

            }

        )

    }

}</code>

伊谢尔伦伊谢尔伦2849 days ago600

reply all(3)I'll reply

  • 巴扎黑

    巴扎黑2017-04-11 13:04:26

    先说下基础

    $.post() 是异步的。jQuery 中这个方法返回的是一个 promise 对象,它有三个方法注册回调

    .done(callback),在 post 成功之后调用,callback(data) 的参数就是后端返回出来的内容。

    .fail(callback),在 post 失败的时候调用

    .always(callback),不管成功失败都会调用。

    以上三个方法可以注册无限个回调处理函数。

    然后

    然后就要看你的业务情况了,你是需要 post 若干次,等所有的数据回来一起处理(并发)呢,还是说有若干次 post,一个完了才能进行下一个(顺序)

    并发的情况

    1

    2

    3

    4

    5

    6

    7

    8

    <code>$.when(

        $.post(url1),

        $.post(url2),

        $.post(url3),

        $.post(url4)

    ).done(function(r1, r2, r3, r4) {

        // do something

    });</code>

    顺序的情况

    1

    2

    3

    4

    5

    6

    7

    8

    9

    <code class="javascript">$.post(url1).then(function(r1) {

        return $.post(url2, { v: r1 });

    }).then(function(r2) {

        return $.post(url3, { v: r2 });

    }).then(function(r3) {

        return $.post(url4, { v: r3 });

    }).then(function(r4) {

        console.log("all done");

    });</code>

    reply
    0
  • PHP中文网

    PHP中文网2017-04-11 13:04:26

    你这是ajax, ajax是异步的,你这里 function(data,state){} 是回调,没有执行完网络请求之前,肯定是不会执行这里的代码。

    http://api.jquery.com/jQuery....

    reply
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-11 13:04:26

    可以改为$.ajax,然后将异步改为同步
    或者是ajaxStart中设置为同步

    reply
    0
  • Cancelreply