2016-08-11 45 views
11

我使用一個陣營終極版的項目,我碰到這個評論中的代碼來:意懶評價在Javascript

這是一個thunk,這意味着它是立即返回一個 功能函數進行懶惰評估。這對於創建 異步操作非常有用,特別是在與redux-thunk結合使用時!

現在,如果我正確地理解這一點,懶惰評估是返回函數的過程。返回一個函數的目的是什麼,這對於創建異步操作有什麼好處?

呵呵還,是一個thunk只是一個功能?

回答

18

thunk是一個函數,它不接受任何參數並返回一些東西(或做某種副作用)。懶惰的評價是推遲的表達式的計算,直到後來的過程中,這樣就可以用的thunk來完成:

// Not lazy 
var value = 1 + 1 // immediately evaluates to 2 

// Lazy 
var lazyValue =() => 1 + 1 // Evaluates to 2 when lazyValue is *invoked* 

您也可以返回值懶:

// Not lazy 
var add = (x, y) => x + y 
var result = add(1, 2) // Immediately evaluates to 3 

// Lazy 
var addLazy = (x, y) =>() => x + y; 
var result = addLazy(1, 2) // Returns a thunk which *when evaluated* results in 3. 

最後,我們可以推遲一些異步操作:

// Not lazy 
var callApi = spec => fetch(spec.url, spec.options); 
// Immediately returns a Promise which will be fulfilled when the network response is processed. 
var result = callApi({url: '/api', options: {}}); 

// Lazy 
var callApiLazy = spec =>() => fetch(spec.url, spec.options); 
var result = callApiLazy({url: '/api', options: {}}); 
// result is a thunk that when evaluated will return a Promise ... 
// which will be fulfilled when the network response is processed. 

現在一個thunk不到採取零參數 - 您可以返回一個懶惰的值,需要更多的參數才能成功評估。這通常也稱爲「鑽營」:

// Curried add (not lazy) 
var add = x => y => x + y 
var add3 = add(3) 
var result = add3(7) // Immediately evaluates to 10 

終極版,形實轉換讓你恢復的功能,而不是對象,動作和與dispatch函數調用你的函數。然後,你可以懶惰地同步或異步地產生一個或多個動作。大多數情況下,你會想要使用它來允許你異步調度。

參見:

+2

_「不接受任何參數」_在這個實例中不是真的......一個redux thunk接受'dispatch',它允許延遲動作分派。 – sdgluck

+0

是的,'redux-thunk'正在延伸thunk一點點。我會加上。 –

+0

你好,這非常有趣!因此,基本上在第一個例子中,'value'不是懶惰的,因爲它是一個變量,並且立即進行評估。其中'lazyValue'是變量的函數,因此直到變量被調用才進行評估。在第二個例子中,「懶惰」會因爲被認爲是因爲'result'調用'add's函數嗎?另外,對於示例2中的'lazy',是否在'result'上出現拼寫錯誤?難道它不是'addLazy(1,2)'? –

1

通常情況下,Redux的行動創造者是同步的,這意味着,當你打電話給他們,你會希望他們返回一個動作和減速被稱爲立即和州立即改變。你也希望這個過程非常快,因爲除了一個小型的CPU綁定操作外,其他操作都將被執行。

但是,有時您希望您的操作創建者轉到服務器,或者執行一些需要一段時間的非CPU綁定操作。那是什麼時候返回一個函數纔有意義。

當您的動作創建者返回一個函數時,立即返回。從誰稱動作創造者的角度來看,沒有什麼奇怪的事情發生。一切都如常。但是在內部,您的動作創建者不會返回Action對象,而是返回一個像這樣的函數。

function DoSomethingAsync() { 
    return (dispatch) => { 
     // go do something realllly slowly. 
     // ok now get the RESULT and call a regular action 
     dispatch(mySyncAction(RESULT)); 
    } 
} 

通常DoSomethingAsync將返回一個ObjectRedux-Thunk中間件所做的是來檢測,而不是函數返回。因此,它只是調用這個函數,像往常一樣傳遞相同的dispatch

現在,調用dispatch來調用SYNC操作的回調函數是可回調的。