2009-11-21 78 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);