我正在尝试掌握如何从Redux Action Creator中返回承诺。 我读过这两篇文章,但都不是更明智的。也许我只是傻瓜。 ;)
https://redux.js.org/advanced/middleware https://medium.com/collaborne-engineering/returning-promises-from-redux-action-creators-3035f34fa74b
startCreateNote()
的动作请参见下面的代码。
//ADD_NOTE action generator
export const addNote = (id, note) => ({
type: ADD_NOTE,
id,
note
})
export const startAddNote = (noteData = {}) => {
return (dispatch, getState) => {
//Database API Instruction object
const apiInstruction = { action: DB_ACTION_ADD, payload: noteData, uid: getState().auth.uid }
//Call database API to insert Note into Database
return noteDatabaseAPI(apiInstruction)
.then(({id, reduxStoreObj}) => {
//The database API resolves id of newly created Note & reduxStore object
//THIS IS WHAT I WANT TO ACHIEVE!
dispatch(addNote(id, reduxStoreObj)).then(
toast("New note saved!")
).catch(
toast.error("ERROR - Note was not saved!")
)
}).catch( (err) => {
//This gets triggered with error message:
//database fail! - TypeError: "dispatch(...).then is not a function"
console.log('database fail! -', err)
})
}
}
如何让我的动作创建者兑现承诺?
答案 0 :(得分:0)
据我了解,使操作创建者返回承诺的(可能)最简单的方法是使用以下几种异步操作库之一:
我在这里找到了更多信息:https://decembersoft.com/posts/what-is-the-right-way-to-do-asynchronous-operations-in-redux/#redux-saga
答案 1 :(得分:0)
一种简单易行的方法是通过减速器进行。
您可以按照如下步骤在减速器中添加一个isNoteSaved
变量。
case ADD_NOTE_REQUEST:
return {
...state,
isNoteSaved: false
}
case ADD_NOTE_SUCCESS:
return {
...state,
isNoteSaved: true
}
case ADD_NOTE_FAILURE:
return {
...state,
error: action.payload,
isNoteSaved: false
}
您的isNoteSaved
变量的初始状态为false
。
然后代替您的承诺,您可以添加以下内容:
toast() && addNoteReducer.isNoteSaved
这意味着isNoteSaved
为true时将执行您的函数。
这就是我的方法。向动作创建者添加承诺会增加复杂性,并使代码的可读性降低。