2017-08-08 54 views
1

我在使用Google,並且我沒有真正發現任何東西,或者我只是不明白它。我有Redux Thunk,我正在通過他們的例子,但我不確定這是否會對我有幫助?我怎樣才能知道什麼時候執行Redux動作

我通常會使用Promise ..但從我瞭解Redux更新狀態時,它完成異步..所以我不認爲這會工作?

export function setComposition(composition) { 
    return { type: types.SET_COMPOSITION, composition }; 
} 

export function doStuff() { 
    // What I'd like to do: 
    dispatch(setComposition).then(() => { 
    console.log('done'); 
    }); 
} 

編輯:

這是我在想什麼做的......但我不認爲會工作,因爲沒有國家獲得異步更新?

export function setComposition(composition) { 
    return Promise.resolve(
    return { type: types.SET_COMPOSITION, composition }; 
); 
} 

回答

1

你應該添加一個動作,以檢查是否異步操作完成後:

export function setComposition(composition) { 
    return { type: types.SET_COMPOSITION, composition }; 
} 
export function successComposition() { 
    return { type: types.SET_COMPOSITION_SUCCESS }; 
} 

export function doStuff() { 
    // What I'd like to do: 
    dispatch(setComposition()); 
    yourAsyncFunction.then(() => { 
    console.log('done'); 
    dispatch(successComposition()); 
    }); 
} 
+0

當你做派遣(setComposition)...是不是異步? (我使用thunk)。那麼console.log('done')可能會在組合設置爲全局狀態之前被調用?除非我理解了所有這些不正確.. – user1189352

+1

Redux-thunk允許分派異步函數,但是你的setComposition動作不是異步的,在這種情況下,你有兩個簡單的動作開始和結束的異步doStuff動作。 –

+0

謝謝,所以我的理解錯了 – user1189352

1

問得好! Redux Thunk用於確保異步操作(例如通過axios向數據庫發出請求)確實會異步處理。

因此,除非您的setComposition操作需要異步,否則不需要使用thunk。因爲它是同步的,你可能只是這樣做的時候看到它完成的情況下:

dispatch(setComposition(compositionToSet)) //remember to pass in composition instance! 
console.log('all done!') 

除非您撰寫的生產代碼和行動正在分批,上述更新Redux的應該是同步的。

此外,應該注意的是,this.setState()用於更新組件的本地狀態可以是異步的,這可能是您在說狀態更新爲異步時所考慮的內容。

相關問題