强制代码在另一个方法完成执行后执行

时间:2013-03-12 11:50:21

标签: javascript

这是我想要做的:

setSource是一个执行约3秒的函数。

 editor.setSource();

 setTimeout(function () {
      //do something, some commands
 }, 3000);

我希望//执行某些操作,在执行setSource()的最后一行之后执行一些命令。现在我正在使用setTimeout,但我认为这不是一个很好的解决方案,因为有时setSource()可能需要5秒才能执行。怎么做?

3 个答案:

答案 0 :(得分:6)

setSource采用回调参数:

editor.setSource = function(callback) {
    // do editor things
    callback();
}

然后传递下一个要执行的代码块作为回调:

editor.setSource(function() {
    // do some other things
});

如果您可以访问jQuery的延迟对象,可以在这里使用它们:

  1. 制作一个新的延期对象。
  2. 启动超时以执行长任务。
  3. 返回延迟对象。
  4. 在超时时,任务完成后,请致电deferred.resolve
  5. 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)

此答案使用promisesECMAScript 6标准的JavaScript功能。如果您的目标平台不支持promises,请将其填充为PromiseJs

在较新的浏览器版本中,您可以使用ES6 promiseseditor.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成功时才会被调用。