0

我想在完成调用上一个更改方法后调用一个 change() 方法,如下所示:

$('#editMPS_structure .alcanceMarca').find('.marca').val(enlaceMarca).change();
$('#editMPS_structure .alcanceProducto').find('.producto').change();


$('.marca').on('change', function() {
    $.ajax({ //ajax call to populate .producto select according a value of marca })
})

$('.producto').on('change', function() {
    $.ajax({ //ajax call})
})

但问题是调用.alcanceProducto 的第二个change() 方法而没有完成第一个change() 方法,我需要在完成第一个change() 之后调用第二个change()。

我不想将第二次调用 change() 放在第一个 ajax change() 中,但我认为存在另一种方法或函数可以做到这一点。

4

4 回答 4

1

您几乎没有选择(这取决于要求和代码复杂性)。首先也是更天真:

  • 让我们为您的请求设置asyncfalseajax()第一个请求完成之前不会执行下一行代码(但您的页面也不会刷新)。
  • 让我们将第二个调用放在第一个调用的回调(或其中一个 jQuery 帮助器方法)中(这样它将在第一个调用结束时执行)。
  • 让我们使用whenjQuery 的功能(它模仿您可能手动编写的请求链)。

如果您的代码路径不是那么直截了当和/或您必须处理更棘手的情况(例如,当用户操作可能启动多个请求时)您必须创建自己的列表。

每个on('change')处理程序都不会启动请求,但会将其放入 FIFO 中,然后它将弹出第一个条目并执行该条目。在回调函数中,它将弹出下一个(如果多个请求已排队,则依此类推)。您可以从这个链接开始,以获得一个工作示例。

于 2013-07-16T15:59:45.447 回答
0

只需将 ajax 调用返回的延迟保存在一个变量中,然后在其上调用 done() 以查看它是否已完成:

var ajax = $.ajax(); // avoids calling done() on undefined

$('.marca').on('change', function() {
    ajax = $.ajax({
        url: 'something'
    }).done(function(data) {
        console.log('first'); // will always complete before the next one
    });
});

$('.producto').on('change', function() {
    ajax.done(function() {
        $.ajax({
            url: 'something'
        }).done(function(data) {
            console.log('second'); // will always complete after the first one
        });
    });
});

小提琴

于 2013-07-16T16:08:02.017 回答
0

我将首先通过以下方式为您的 ajax 调用创建函数:

function ajax1(endFunc){
    $.ajax({ //ajax call to populate .producto select according a value of marca })
    .done(function(){
       if(typeof endFunc === "function") 
            endFunc();
     });
}

function ajax2(){
     $.ajax({ //ajax call})
}

然后我会写以下内容:

ajax1(ajax2);

代替 :

('#editMPS_structure .alcanceMarca').find('.marca').val(enlaceMarca).change();
$('#editMPS_structure .alcanceProducto').find('.producto').change();

不要忘记将您的新功能与 onchanges 链接:

$('.marca').on('change', ajax1);
$('.producto').on('change', ajax2);

那将是我的解决方案。不幸的是,我现在无法对其进行测试,但我认为它应该可以工作。让我知道 !

于 2013-07-16T15:59:58.637 回答
-1

保持change.producto 上的事件设置,直到第一个 ajax 调用的响应完成

$('.marca').on('change', function() {
    $.ajax({ //.... })
      .done(function() { 
        $('.producto').on('change', function() {
          $.ajax({ //ajax call})
于 2013-07-16T15:57:09.410 回答