2009-11-21 52 views
5

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

doSomething(); 
doSomethingElse(); 

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

+2

不贴你已经做你想要什么呢?我在这里错过了什么? – 2009-11-21 00:40:25

+1

+1来衡量-1。这个问题和其他问题一样有效。 – echo 2009-11-21 00:44:22

+1

任何机会,你可以给我们更多的代码或告诉我们你想要做什么? – Nosredna 2009-11-21 01:36:34

回答

7

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

+0

我正在做一个ajax请求,所以这看起来像是将其放入回调函数的有效解决方案,但我只是试图在回调之外执行它。 – ngreenwood6 2009-11-21 02:00:01

-1

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

retval = doSomething(); 
    doSomethingElse(retval); 

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

想法从Code Complete中解除。

+5

我不明白这是如何解决任何事情。如果doSomething()正在做一些异步操作,问题才有意义。返回并传递值不会影响工作完成的时间。 – Nosredna 2009-11-21 01:30:26

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秒,表示“First”,“Second”,“Third”。

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

如果您的功能需要参数,例如doSomething(x,y,z)您需要将runMe函数修改为更好的部分,并以不同的方式构造返回的函数。检查这里或发布新的问题。

javascript partial

+1

非常有趣 – gpilotino 2009-11-21 01:29:12

+2

为什么不只是在JS对象中做排队和出队。似乎没有意义将它弹出到虚拟DOM元素中。 – nickytonline 2009-11-21 01:41:54

+0

?我该怎么用jQuery来做到这一点?猜猜在这一天的这个时候(上午02点45分)我无法理解你的意思。 – jitter 2009-11-21 01:49:17

2

这个问题有点含糊。

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

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

3

您可能要做到这一点....

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

function doSomethingElse() { 
} 

doSomething(doSomethingElse);