我在sagas.js
中有此代码。
import { put, takeLatest } from "redux-saga/effects";
import { getArticles } from "../scripts/resources/articles";
import { GET_ARTICLES, SHOW_MATCHES } from "./constants";
function getMatches(action) {
const { searchValue } = action;
getArticles(searchValue, (matches) => {
console.log(matches)
put({ type: SHOW_MATCHES, payload: matches })
})
}
export default function* rootSaga() {
yield takeLatest(GET_MATCHES, getMatches);
}
这是getArticles
函数。
export function getArticles(input, callBack) {
setTimeout(() => {
callBack(filterArticles(input));
}, 300);
};
回调中的put实际上并没有分派动作,因为我在reducer中没有找到这种情况。我该如何调度此动作?
答案 0 :(得分:1)
首先,仅在呼叫put()
之前,调用yield
不会对看似虚假的频道传递放置效果。
第二,yield
必须在生成器函数内使用,因此您需要将yield put(...)
的调用者及其调用者的调用者更改为生成器函数形式,即
function *(){
yield anotherGeneratorFunction()
}
以下更改的代码就可以使用
const { createStore, applyMiddleware } =require('redux')
const createSagaMiddleware =require('redux-saga').default
const { takeLatest ,take,put}=require('redux-saga/effects')
const {delay} =require('redux-saga')
const sagaMiddleware = createSagaMiddleware()
const reducer=(state=[],action)=>{return [...state,action.type];}
const store = createStore(
reducer,
applyMiddleware(sagaMiddleware)
)
function * getMatches(action) {
const { searchValue } = action;
yield getArticles(searchValue, function * (matches) {
console.log(matches)
yield put({ type: 'SHOW_MATCHES', payload: matches })
})
}
function * getArticles(input, callBack) {
yield delay(300)
yield callBack(filterArticles(input));
};
function filterArticles(input){
return ['artical1','artical2']
}
function* rootSaga() {
yield takeLatest('GET_MATCHES', getMatches);
}
sagaMiddleware.run(rootSaga)
store.dispatch({type:'GET_MATCHES',searchValue: 'test'})
setTimeout(() => {
console.log(store.getState())
}, 1000);
这将输出
[ 'artical1', 'artical2' ]
[ '@@redux/INIT5.m.i.0.z.9', 'GET_MATCHES', 'SHOW_MATCHES' ]