在执行下一个ajax之前执行ajax inside condition

时间:2016-07-17 14:55:55

标签: javascript php jquery ajax

我在数据库中有两个表,当按下提交按钮时我想将新交易者插入到交易者表中并使用laravel 5.2通过在条件下使用post ajax获取id,然后执行另一个发布ajax的发票插入,但是在这种情况下的问题是当我按下提交时它在第一个ajax之前执行第二个ajax ..为什么?

$(document).ready(function(e) {

$('#invoiceForm').validate({

    //rules: itemRules,

    errorPlacement: function (element) {
        return false;
    },
    submitHandler: function (event) {
        //event.preventDefault();
       // $('#selectedTraderName').valid();
        var allItems = [];
        $('tr.inputsItem').each(function () {
         rowData = $(this).children('td').find('.form-control').map(function () {
            return $(this).val();
        }).get();
            rowData.push(parseInt($(this).children('td').find('strong#autoTotal').text().trim()));
            if($('select[id=selectedTraderName]').val() <= lastTraderID) {
                rowData.push($('select[id=selectedTraderName]').val());
            }
            else{
                newTrader = [];
                newTrader.push($('#name').val());
                newTrader.push($('#traderMail').val());
                newTrader.push($('#mobileNumber').val());
                newTrader.push($('#address').val());
                $.ajax({
                    type: 'POST',
                    url: insertNewTrader,
                    data:{_token:token, trader:newTrader}
                }).done(function (msg) {
                    rowData.push(msg['id']);
                });

            }
            alert(rowData[6]);
            allItems.push(rowData);
            $.ajax({
                type: 'POST',
                url: insertNewItem,
                data:{_token:token, items:allItems}
            }).done(function () {
                alert('done');
            });
        });


    }

});

2 个答案:

答案 0 :(得分:0)

检查第二个ajax请求条件并在第一个ajax功能完成部分/成功部分调用第二个ajax函数。

$.ajax({
  type: 'POST',
  url: insertNewItem,
  data:{_token:token, items:allItems},
  complete : function(){
  //call ur 2nd ajax request here
  },
  success : function(data){
  console.log(data);
  //call ur 2nd ajax request here
  }
});

答案 1 :(得分:0)

当然,由于if/else语句,您无法嵌套ajax调用,而是可以像这样使用Deferred object

rowData.push(parseInt($(this).children('td').find('strong#autoTotal').text().trim()));
// Create a new Deferred object
var deferred = $.Deferred();
if ($('select[id=selectedTraderName]').val() <= lastTraderID) {
    rowData.push($('select[id=selectedTraderName]').val());
    //Nothing to wait just resolve the deferred
    deferred.resolve();
} else {
    newTrader = [];
    newTrader.push($('#name').val());
    newTrader.push($('#traderMail').val());
    newTrader.push($('#mobileNumber').val());
    newTrader.push($('#address').val());
    $.ajax({
        type: 'POST',
        url: insertNewTrader,
        data: {
            _token: token,
            trader: newTrader
        }
    }).done(function(msg) {
        rowData.push(msg['id']);
        //Resolve the deferred
        deferred.resolve();
    });

}
//When the deferred resolved then execute your next ajax request
deferred.then(function() {
    allItems.push(rowData);
    $.ajax({
        type: 'POST',
        url: insertNewItem,
        data: {
            _token: token,
            items: allItems
        }
    }).done(function() {
        alert('done');
    });
});

我希望这会帮助你。