这是我想要做的:
setSource是一个执行约3秒的函数。
editor.setSource();
setTimeout(function () {
//do something, some commands
}, 3000);
我希望//执行某些操作,在执行setSource()的最后一行之后执行一些命令。现在我正在使用setTimeout,但我认为这不是一个很好的解决方案,因为有时setSource()可能需要5秒才能执行。怎么做?
答案 0 :(得分:6)
让setSource
采用回调参数:
editor.setSource = function(callback) {
// do editor things
callback();
}
然后传递下一个要执行的代码块作为回调:
editor.setSource(function() {
// do some other things
});
如果您可以访问jQuery的延迟对象,可以在这里使用它们:
deferred.resolve
。
editor = {
setSource: function() {
var deferred = $.Deferred();
console.log("Beginning editor.setSource...");
setTimeout(function() {
// This function took a while to occur
deferred.resolve();
}, 3000);
return deferred;
}
}
$.when(editor.setSource()).then(function() {
console.log("Editor is done!");
});
如果您正在进行AJAX或动画或其他已经使用延迟对象的jQuery任务,您只需返回其结果值,而不是创建自己的延迟对象:
editor = {
setSource: function() {
return $.get({
url: "myurl.com/mypage",
data: $("#myform").serialize()
});
}
}
$.when(editor.setSource()).then(function() {
console.log("Editor is done!");
});
确保查找如何解决或拒绝延迟对象,以及如何处理这些对象。
答案 1 :(得分:3)
promises
,ECMAScript 6
标准的JavaScript功能。如果您的目标平台不支持promises
,请将其填充为PromiseJs。在较新的浏览器版本中,您可以使用ES6 promises
。 editor.setSource()
将其执行包装为Promise
并将其返回,因此可以继续执行其他功能。
editor.setSource = function(){
return new Promise(function(fulfill, reject){
//do your work
fulfill(resultValue);
});
};
要继续使用其他函数,只需在promise上使用then
方法。
var promise = editor.setSource();
promise.then(function(result){
//do something more
});
答案 2 :(得分:0)
我也在寻找解决方案,我只想在上一个函数完全执行后执行我的第二个函数,我尝试了回调函数但仍然没有得到解决方案,最后我找到了通过使用简单来解决这个问题的最简单方法$.ajax({ });
方法代码,适用于我:)。
例如,
$.ajax({
url: function1(),
success: function(){
//function 2 code here or just call function2() here
}
});
就是这样,在这段代码中,url参数将调用第一个函数,并且仅在其执行函数2成功时才会被调用。