我有以下JavaScript代码:
$('a.button').click(function(){
if (condition == 'true'){
function1(someVariable);
function2(someOtherVariable);
}
else {
doThis(someVariable);
}
});
如何确保仅在function1
完成后才调用function2
?
发布于 2011-02-15 14:11:55
指定匿名回调,并让function1接受:
$('a.button').click(function(){
if (condition == 'true'){
function1(someVariable, function() {
function2(someOtherVariable);
});
}
else {
doThis(someVariable);
}
});
function function1(param, callback) {
...do stuff
callback();
}
发布于 2014-03-18 15:31:36
试试这个:
function method1(){
// some code
}
function method2(){
// some code
}
$.ajax({
url:method1(),
success:function(){
method2();
}
})
发布于 2015-09-22 21:26:44
此答案使用promises
,这是ECMAScript 6
标准的JavaScript特性。如果你的目标平台不支持promises
,用PromiseJs填充它。
Promises是一种在JavaScript中处理异步操作的新方法(而且要好得多):
$('a.button').click(function(){
if (condition == 'true'){
function1(someVariable).then(function() {
//this function is executed after function1
function2(someOtherVariable);
});
}
else {
doThis(someVariable);
}
});
function function1(param, callback) {
return new Promise(function (fulfill, reject){
//do stuff
fulfill(result); //if the action succeeded
reject(error); //if the action did not succeed
});
}
对于这个简单的示例,这似乎是一个很大的开销,但对于更复杂的代码,它比使用回调要好得多。您可以使用多个then
语句轻松链接多个异步调用:
function1(someVariable).then(function() {
function2(someOtherVariable);
}).then(function() {
function3();
});
您还可以轻松地包装jQuery延迟(从$.ajax
调用返回):
Promise.resolve($.ajax(...params...)).then(function(result) {
//whatever you want to do after the request
});
正如@charlietfl所指出的,由$.ajax()
返回的jqXHR
对象实现了Promise
接口。所以实际上没有必要将它包装在Promise
中,它可以直接使用:
$.ajax(...params...).then(function(result) {
//whatever you want to do after the request
});
https://stackoverflow.com/questions/5000415
复制相似问题