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

这是我想要做的:

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

 editor.setSource();

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

我想//执行一些操作,在执行setSource()的最后一行之后执行一些命令部分。 现在我用setTimeout来做这件事,但我认为这不是一个很好的解决方案,因为有时setSource()需要5秒钟才能执行。 这个怎么做?


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!");
    });
    

    确保查找如何解决或拒绝延迟对象,以及如何处理这些对象。


    这个答案使用了promises ,这是ECMAScript 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
    });
    

    我也在寻找解决方案,只有在前一个函数完全执行之后,我才想执行第二个函数,但我仍然尝试了回调函数,但仍然没有得到解决方案,最后我找到了使用简单的$.ajax({ });解决此问题的最简单方法$.ajax({ }); 方法代码,这对我有用:)。

    例如,

    $.ajax({
      url: function1(),
      success: function(){
        //function 2 code here or just call function2() here
      }
    }); 
    

    就是这样,在这个代码中,url参数将会调用第一个函数,并且只有在它的执行函数成功时才会调用2。

    链接地址: http://www.djcxy.com/p/55299.html

    上一篇: Force code to execute after another method finishes executing

    下一篇: How to handle multiple forms in one page