search

Home  >  Q&A  >  body text

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

//先上代码

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);
            }
        )
    }
}
伊谢尔伦伊谢尔伦2805 days ago576

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,一个完了才能进行下一个(顺序)

    并发的情况

    $.when(
        $.post(url1),
        $.post(url2),
        $.post(url3),
        $.post(url4)
    ).done(function(r1, r2, r3, r4) {
        // do something
    });

    顺序的情况

    $.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");
    });

    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