我使用一個陣營終極版的項目,我碰到這個評論中的代碼來:意懶評價在Javascript
這是一個thunk,這意味着它是立即返回一個 功能函數進行懶惰評估。這對於創建 異步操作非常有用,特別是在與redux-thunk結合使用時!
現在,如果我正確地理解這一點,懶惰評估是返回函數的過程。返回一個函數的目的是什麼,這對於創建異步操作有什麼好處?
呵呵還,是一個thunk只是一個功能?
我使用一個陣營終極版的項目,我碰到這個評論中的代碼來:意懶評價在Javascript
這是一個thunk,這意味着它是立即返回一個 功能函數進行懶惰評估。這對於創建 異步操作非常有用,特別是在與redux-thunk結合使用時!
現在,如果我正確地理解這一點,懶惰評估是返回函數的過程。返回一個函數的目的是什麼,這對於創建異步操作有什麼好處?
呵呵還,是一個thunk只是一個功能?
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
函數調用你的函數。然後,你可以懶惰地同步或異步地產生一個或多個動作。大多數情況下,你會想要使用它來允許你異步調度。
參見:
通常情況下,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
將返回一個Object
。 Redux-Thunk
中間件所做的是來檢測,而不是函數返回。因此,它只是調用這個函數,像往常一樣傳遞相同的dispatch
。
現在,調用dispatch
來調用SYNC操作的回調函數是可回調的。
_「不接受任何參數」_在這個實例中不是真的......一個redux thunk接受'dispatch',它允許延遲動作分派。 – sdgluck
是的,'redux-thunk'正在延伸thunk一點點。我會加上。 –
你好,這非常有趣!因此,基本上在第一個例子中,'value'不是懶惰的,因爲它是一個變量,並且立即進行評估。其中'lazyValue'是變量的函數,因此直到變量被調用才進行評估。在第二個例子中,「懶惰」會因爲被認爲是因爲'result'調用'add's函數嗎?另外,對於示例2中的'lazy',是否在'result'上出現拼寫錯誤?難道它不是'addLazy(1,2)'? –