如何使用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调用没有到达,当不接受函数时,它接受延迟对象作为参数