5

有没有办法在另一个函数完成后运行一个函数?例如:

doSomething();
doSomethingElse();

我只希望 doSomethingElse() 在 doSomething 完成后运行。这可能吗?

4

5 回答 5

7

如果您的doSomething()函数正在异步执行某些操作(例如发出 Ajax 请求),那么您将希望doSomethingElse()为该异步请求进行回调,而不是让它在doSomething()返回后立即执行。

于 2009-11-21T00:42:44.263 回答
6

实际上你可以用 jQuery 做你想做的事(至少在某种意义上)。它可能被认为有点hacky,但完美无瑕。

只需在您的页面中包含一个您不用于其他任何内容的元素。例如某处的空 div。

<div id="syncFnHolder"></div>

然后将 JS 包含在您的函数中 +runMe我编写的函数中。

function doSomething() { alert("First"); }
function doSomethingElse() { alert("Second"); }
function doSomethingElseThree() { alert("Third"); }

function runMe(fn, selec) {
    return function() {
        fn();
        setTimeout(function() {
            $(selec).dequeue("syncFnQueue");
        }, 1000);
    } 
};

var selector = "#syncFnHolder";
//add three functions to a queue
$(selector).queue("syncFnQueue", runMe(doSomething, selector));
$(selector).queue("syncFnQueue", runMe(doSomethingElse, selector));
$(selector).queue("syncFnQueue", runMe(doSomethingElseThree, selector));
//start first function in queue (FIFO) others are triggered automatically
$(selector).dequeue("syncFnQueue");

这将生成三个警报,它们之间的距离为 1 秒,分别表示“第一”、“第二”、“第三”。

如果您不想延迟,请删除 setTimeout 并将呼叫留给$(selec).dequeue("syncFnQueue");.

如果您的函数需要参数,例如doSomething(x,y,z),您需要将runMe函数调整为更好的局部函数并以不同的方式构造返回的函数。在此处检查或发布新问题。

javascript部分

于 2009-11-21T01:23:49.377 回答
3

你可能想这样做....

function doSomething(callback) {
    // code for do some thing
    // now fire off the callback
    if (typeof callback === 'function') {
        callback();
    }
}

function doSomethingElse() {
}

doSomething(doSomethingElse);
于 2013-04-01T07:29:58.033 回答
2

问题有点模糊。

如果您的函数对它们有异步位,则使用回调。这就是他们的目的。

但是,如果您想在 JavaScript 中进行面向方面的编程,请查看jQuery-aop

于 2009-11-21T01:35:35.203 回答
-1

本身没有办法明确地强制执行这一点,但一个想法是让 doSomething() 返回一个 doSomethingElse() 接受作为参数的值:

  retval = doSomething();
  doSomethingElse(retval);

这样至少你可以防止某人在没有提供它需要的参数的情况下调用 doSomethingElse() ......当然,他们是否从调用 doSomething() 中获得该参数是另一个问题。但这是一个开始。

从 Code Complete 提出的想法。

于 2009-11-21T00:42:42.653 回答