确定ajax调用已完成以运行另一个ajax调用

时间:2018-02-14 19:15:36

标签: javascript php jquery ajax function

在我的项目中,我有一些select选项组,它根据以前的值加载ajax数据。现在,当我尝试将它们复制到另一个选择选项组时,我遇到了问题。

这是方案

parmanet address              Present Address
Division                      Division    
District                      District
Upzilla                       Upzilla
Union                         Union  

所有这些都是选择字段,然后选择每个字段后,选择由ajax加载的选项。我放了一个复选框,当用户点击复选框时,parmanent地址数据应复制到所有ajax调用的当前地址。

现在的问题是,jquery“val”函数无法正常工作,因为它在从ajax加载的数据之前运行。如果我将延迟时间设置为100毫秒,那么它可以工作,但这不是一个正确的方法。有没有更好的方法来解决这个问题?

当我改变除法以将ajax数据加载到除法时,这是我的代码,其他选项与此类似。

$('#divisions').change(function() {
    $("#villtable").hide();
    $("#villaddform").hide();
    $.ajax({
      type: 'post',
      url: 'GetDistricts',
      data: {
        get_option:this.value
      },
      success: function(response) {
        document.getElementById("districts").innerHTML=response;
      }
    });
  });

这就是我试图将数据复制到当前地址组...

$.when( $('.division-prese').val(divi).trigger('change').delay( 100 ) ).then(function() {
    $.when( $('.district-prese').val(dist).trigger('change').delay( 100 ) ).then(function() {
        $.when( $('.upazilla-prese').val(upaz).trigger('change').delay( 100 ) ).then(function() {
                        $('.union-prese').val(unio).trigger('change');
        });   
    });
});

我也试过'完成',但仍然无法正常工作。

2 个答案:

答案 0 :(得分:2)

提取逻辑并在两个地方使用它的一般想法,其中一个执行承诺链。

function loadDistricts ($divisions) {
	return $.ajax({
		type: 'post',
		url: 'GetDistricts',
		data: {
		  get_option: $divisions.val()
		},
		success: function(response) {
			$('#districts').html(response);
		}
	  });
}

//... other methods

var $divisions = $('#divisions');
var $districts = $('#districts');
var $upazillas = $('#upazillas');

$divisions.change(function() {
    $("#villtable").hide();
	$("#villaddform").hide();
	loadDistricts($divisions);
});

//... other change methods

$('.division-prese').val(divi);

loadDistricts($divisions).then(function(){
	$('.district-prese').val(dist);

	loadUpazillas($upazillas).then(function(){
		$('.upazilla-prese').val(upaz);

		//call next thing
	});
});

答案 1 :(得分:-1)

尝试在通话前添加退货

$('#divisions').change(function() {
    $("#villtable").hide();
    $("#villaddform").hide();
      return $.ajax({
      type: 'post',
      url: 'GetDistricts',
      data: {
        get_option:this.value
      },
      success: function(response) {
        document.getElementById("districts").innerHTML=response;
      }
    });
  });