2

这是我想做的事情:

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

 editor.setSource();

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

我想要 //do something, some commands 部分在 setSource() 的最后一行执行之后执行。现在我用 setTimeout 来做,但我认为这不是很好的解决方案,因为有时 setSource() 可能需要 5 秒才能执行。这该怎么做?

4

3 回答 3

7

setSource一个回调参数:

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

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

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

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

  1. 创建一个新的延迟对象。
  2. 开始超时以完成您的长期任务。
  3. 返回延迟对象。
  4. 在超时时间内,一旦任务完成,调用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!");
});

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

于 2013-03-12T11:53:24.167 回答
3

这个答案使用标准promises的 JavaScript 特性ECMAScript 6。如果您的目标平台不支持promises,请使用 PromiseJs 对其进行polyfill

在较新的浏览器版本中,您可以使用ES6 promises. editor.setSource()将其执行包装到 a 中Promise并返回它,因此可以继续使用其他函数。

editor.setSource = function(){
    return new Promise(function(fulfill, reject){
        //do your work
        fulfill(resultValue);
    });
};

要继续使用另一个函数,只需使用thenpromise 上的方法。

var promise = editor.setSource();
promise.then(function(result){
    //do something more
});
于 2015-09-23T07:43:32.393 回答
0

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

例如,

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

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

于 2017-07-05T13:37:26.630 回答