jquery同步函数

时间:2009-11-21 00:35:27

标签: jquery function synchronous

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

doSomething();
doSomethingElse();

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

5 个答案:

答案 0 :(得分:7)

如果您的doSomething()函数异步执行某些操作(例如发出Ajax请求),那么您将需要使doSomethingElse()成为该异步请求的回调,而不是在doSomething()之后立即执行。 {1}}返回。

答案 1 :(得分: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 partial

答案 2 :(得分:3)

你可能想要这样做....

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

function doSomethingElse() {
}

doSomething(doSomethingElse);

答案 3 :(得分:2)

这个问题有点模糊。

如果你的函数有异步位,那么使用回调。这就是它们的用途。

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

答案 4 :(得分:-1)

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

  retval = doSomething();
  doSomethingElse(retval);

这样至少可以阻止某人调用doSomethingElse()而不至少提供它需要的参数......当然,他们是否从调用doSomething()获得该参数是另一个问题。但这是一个开始。

从代码完成中解脱出来的想法。