如何使用JavaScript等待承诺在onchange事件中完成?

如何使用JavaScript等待承诺在onchange事件中完成?,javascript,jquery,promise,Javascript,Jquery,Promise,我需要手动触发菜单上的change事件。但我需要等到change事件完成执行后,才能执行操作 下面是我在代码中尝试做的事情 $('#menu').change(function(){ // do some work // make multiple AJAX calls.... }); $('#button').click(function(){ $('#menu').val(5).change(); // once change is completed I want t

我需要手动触发菜单上的
change
事件。但我需要等到
change
事件完成执行后,才能执行操作

下面是我在代码中尝试做的事情

$('#menu').change(function(){

  // do some work
  // make multiple AJAX calls....

});

$('#button').click(function(){

   $('#menu').val(5).change(); // once change is completed I want to do some logic here.
});
这是我尝试过的,但似乎没有等待
change()
事件完成

$('#button').click(function(){

   $('#menu').val(5).change().promise().done(function(){
      // do some work after the change() event is completed..
   });
});
在更改事件完成之前,如何正确执行代码

已更新

我尝试了以下方法,但仍然不起作用

$('#menu').change(function(){

     makeAjaxCalls($(this).val());

});


$('#button').click(function(){

   makeAjaxCalls(5, function(){
      // do some work after the makeAjaxCalls() is completed..
   });
});

function makeAjaxCalls(id, callback) {
    var task = $.Deferred(function(){
         // Make all ajax calls here...
    });

    $.when(task).then(function() {
        if ($.isFunction(callback)) {
            callback();
        }
    }).catch(function (error) {
        console.log('something wrong... ', error);
    });
}

您希望调用一个函数,该函数可以对菜单更改和按钮单击进行异步调用。有一个简单的解决方案,创建一个函数,读取菜单的值并返回一个承诺,然后在这两个事件中使用它

function makeAjaxCalls() {
    var menuValue = $('#menu').val();
    // Run some ajax calls based on menuValue and return the promise
    return Promise.resolve()
}

$('#menu').change(makeAjaxCalls);
$('#button').click(function(){
    $('#menu').val(5);
    makeAjaxCalls().then(function() {
        // Do something after ajax calls completed
    });
});

一种可能的方法是提供对更改事件的回调

$('select')。关于('change',函数(e,数据){
//模拟异步操作
setTimeout(函数(){
log('element changed');
//如果提供了额外的数据,其中一个是回调,请使用它
if(data&&typeof data.callback==='function'){
data.callback();
}
}, 2000);
});
$('button')。在('click',function()上{
//使用包含回调的额外数据触发更改
$('select').val(2).trigger('change',{callback:function(){console.log('weeee');});
});

1.
2.

单击我
是否确实需要触发更改事件的可能副本,而不是简单地调用公共函数?调用更改没有任何意义。将逻辑放入函数并使用承诺。@MatthewHerbst不,这似乎不处理异步事件handlers@MatthewHerbst您链接的重复帖子通过所更改元素的值关联“完成”。这个问题通过正在完成的更改处理程序中发生的所有异步方法将“complete”关联起来。这是两种完全不同的情况。为什么要将回调函数包装在一个对象中?是的,您可以只给出函数。这只是我想到的第一件事。因此,您可以将其归因于我根深蒂固的编码实践:)@BergiI使用
$.when().then()
尝试了相同的想法,但我无法实现。我在中更新的代码是一个问题。在这种情况下,使用promise时ajax调用会是什么样子?这取决于您用来进行ajax调用的库,我给出了一个promise示例,如果您使用jquery,那么应该用Done替换。我使用的是jquery。我用当前代码更新了我的问题,但代码不起作用。尝试将console.log放入catch,可能是您的ajax调用没有到达,当不接受函数时,它接受延迟对象作为参数