2015-03-02 69 views
0

我仍然試圖用JS定向,並且最近在理解回調角色方面遇到了很多麻煩。JavaScript:使用回調控制程序流程

我可以看到,回調提供了一種更加異步(?)的方式來返回函數中生成的值。例如,這對我來說很有意義:

function summation (a, b, _callback) { 
if (typeof(_callback) === 'function') { 
    _callback(a+b); 
} 
} 

$(document).ready(function() { 
summation(2,3,function (_val) { 
    console.log(_val); 
} 
}); 

與之相對類似var _val = summation(2,3);var不可立即指派以下。

我嘗試使用jQuery處理網頁上的元素時,難以製作此過程。我有跟蹤元件的對象:如果我想傳遞test.mainPane成函數fitToPage()調節所述元件的特性以滿足給定的屏幕尺寸

function createObj (_callback) { 
var test = new Object(); 
test.mainPane = $('#mainPane'); 
if (typeof(_callback) === 'function') { 
    _callback(test); 
} 
} 

,然後想要的元件傳遞給另一個功能createElems()這增加了兒童元素,事情開始土崩瓦解:

$(document).ready(function() { 
createObj(function (test) { 
    fitToPage(test, function (test) { 
    createElems(test, null); 
    }); 
}); 
}); 

而且只似乎越來越差,如果我嘗試通過創建特殊的功能,這什麼也不做避免這種回調地獄,但幫我管理的回調(?)到其他功能。我相信我錯過了一些重要的東西,但還沒有拿出正確的搜索條件來找到它。有更好的方法嗎?

+0

使用承諾。 http://blog.slaks.net/2015-01-04/async-method-patterns/ – SLaks 2015-03-02 19:52:55

+0

你的求和函數有回調的目的是什麼?爲什麼它不能只是'函數求和(a,b){返回a + b; ''? – 2015-03-02 20:10:08

+1

@ c-smile:我懷疑這只是爲了說明回調是如何工作的。用一個實際的異步進程替換summing ... – 2015-03-02 20:12:42

回答

1

您已經遇到了使用回調來處理異步代碼所涉及的主要問題之一。異步性具有傳染性。一旦你開始在一個地方使用它,周圍的代碼也需要它,然後是周圍的代碼,等等。

目前處理此問題的一種比較流行的方法是Promises。這些實際上並沒有消除回調問題,但是它們可以讓你以一種更簡單的語法來處理它們。這個想法是,一個函數不會接受回調函數,而是返回一個對象,調用者可以附加一個稍後處理的回調函數。在承諾庫中,這些對象必須公開一個採用successerror回調的then方法。我不知道是否jQuery的ready方法公開,所以這可能不是很正確,但它應該是接近你將如何與承諾返工你的例子:

$(document).ready() 
    .then(createObj) 
    .then(fitToPage) 
    .then(function(test) {return createElems(test, null)}); 

如果你有一個版本的createElems部分地施加的null,則該最後一行可以簡單地是

.then(createElems2); 
0

JavaScript執行模型是由設計同步。因此,如果您在代碼中調用函數,則函數體將立即執行,同步執行並且不會被其他任務中斷。因此,這個

function summation(a,b) { 
    return a + b; 
} 
var r = summation(1,2); // -> 3 

將被執行,因爲它被寫入。

與此同時,您可以讓瀏覽器運行時環境在發生某些事件時調用[返回]您的函數(回調本身)。因此,你的函數將被異步調用:

function doSomethingWhenDocumentIsLoaded() 
{ 
    // document ready, do something with it. 
} 

$(document).ready(doSomethingWhenDocumentIsLoaded); 

這裏我們定義的函數,並要求運行時調用該函數回來時,該文件將被載入/準備操作。

+0

再次感謝@ c-smile,你回答了一個我沒有意識到的問題。 – ctag 2015-03-03 06:02:38