0

我明白,兩者都是返回函數的函數。簡而言之,thunk和Higher Order Function之間有什麼區別?

到目前爲止,我的經驗使用它們來返回函數,而不僅僅是操作對象,以便我可以使用Redux中的異步請求。

閉包是一個高階函數(HOF)的實現,以便爲私有變量創建一個新的作用域......對嗎? HOF的其他例子包括map,reducefilter

還有其他的東西明確定義了兩者之間的區別嗎?

謝謝。

+1

高階函數是將另一個函數作爲參數的函數。它們返回的內容無關緊要。一個thunk根本不需要任何參數。它只是推遲表達式的評估,並在調用時產生此表達式的結果。 – ftor

回答

2

我明白無論是返回功能

你的理解功能稍有不正確

  • Thunks可以返回任何類型的值 - 而不僅僅是一個功能型
  • Higher-order functions可以返回任何類型的值 - 不只是函數t YPE

我的經驗,到目前爲止用的thunk一直在使用他們返回的功能,而不是僅僅採取行動的對象,這樣我可以在終極版異步請求工作。

Thunks(和高階函數)與任何特定庫(React,Redux)或任何特定控制流(sync,async)都沒有內在關聯。 Thunk只是一個無用函數 - 它們有各種常見用例,但最常用於延遲特定計算的評估。

閉包是一個高階函數(HOF)的實現,以便爲私有變量創建一個新的作用域......對嗎? HOF的其他例子包括map,reduce和filter。

A closure不一定是高階函數的實現。 function關鍵字(和=>箭頭函數語法)確實創建了一個確實具有新(詞法)範圍的閉包。

有沒有其他的東西明確定義了兩者之間的區別?

是的。他們怎麼是一樣的:

  • 他們都是功能
  • 它們可以在任何類型的都返回值

如何不同:

  • 的thunk是零元函數(它們不接受參數)
  • 高階函數接受一個函數作爲參數和/或返回一個函數

也許最關鍵的區別:

  • 一個thunk可以被認爲是一個高階函數如果返回的功能。
4

Thunks是函數包裝表達式,以便延遲他們的評價。

這個延遲是在Redux thunk中實現的,當一個動作被調用時它返回一個函數。隨後可以調用返回的這個函數。

以下是thunk動作的示例。

function incrementAsync() { 
    // the below function is called by Redux Thunk middleware below. 
    return dispatch => { 
    setTimeout(() => { 
     // Yay! Can invoke sync or async actions with `dispatch` 
     dispatch(increment()); 
    }, 1000); 
    }; 

高階函數只是一個函數,它要麼返回一個函數,要麼將一個函數作爲其參數之一。因爲這個函數返回另一個函數,它將dispatch作爲參數,這是一個高階函數的例子。

從終極版的代碼咚中間件類似於此

function createThunkMiddleware() { 
    return store => next => action => { 
    if (typeof action === 'function') { 

     // since action is a function it is a thunk action creator 
     // so call it with store methods 
     return action(store.dispatch, store.getState); 

    } 
    // action is not a function so redux thunk ignores it 
    return next(action); 
    }; 
} 

只要我們的thunk行動的創建者被稱爲它通過中間件鏈發送動作功能。當它到達我們的thunk中間件時,這個動作被識別爲一個函數,因此再次用store的dispatch和getState方法調用。

由於第二次函數調用,我們現在處於我們的thunk動作創建者返回函數的範圍內。這意味着我們現在可以執行異步邏輯並仍然可以訪問商店的getState和調度方法。這就是爲什麼我們的thunk動作創作者可以被視爲一個thunk表達。通過使用更高階的函數,我們可以訪問,但推遲商店的dispatch或getState方法的使用未來的時間。如下所示,遞增操作在一秒延遲後被調用。

function incrementAsync() { 
    // the below function is called by Redux Thunk middleware below. 
    return dispatch => { 
    setTimeout(() => { 
     // Yay! Can invoke sync or async actions with `dispatch` 
     dispatch(increment()); 
    }, 1000); 
    }; 
+0

謝謝@therewillbecode。說所有的thunk是高階函數,但並不是所有的高階函數都是thunk? – bloppit

+0

@bloppit是的,thunk只是高階函數的一個例子,並且與其他函數創建的回調函數差不多。 –

相關問題