Redux传奇:如何放入回调

Redux传奇:如何放入回调,redux,react-redux,redux-saga,Redux,React Redux,Redux Saga,我在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 } =

我在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中的case。如何分派此操作?

首先,仅调用
put()
不会将put效果传递给传奇频道,除非前面有
yield

其次,
yield
必须在生成器函数中使用,因此需要将
yield put(…)
的调用者及其调用者的调用者更改为生成器函数形式,即

function *(){
  yield anotherGeneratorFunction()
}
下面更改的代码可以正常工作

const{createStore,applyMiddleware}=require('redux'))
const createSagaMiddleware=require('redux-saga')。默认值
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(
减速器,
applyMiddleware(sagaMiddleware)
)
函数*getMatches(操作){
const{searchValue}=action;
生成getArticles(搜索值,函数*(匹配项){
console.log(匹配项)
产生put({type:'SHOW_MATCHES',负载:MATCHES})
})
}
函数*getArticles(输入、回调){
产量延迟(300)
产生回调(filterArticles(输入));
};
功能过滤器部件(输入){
返回['artical1','artical2']
}
函数*rootSaga(){
获取最新数据('GET_MATCHES',getMatches);
}
sagaMiddleware.run(rootSaga)
dispatch({type:'GET_MATCHES',searchValue:'test'})
设置超时(()=>{
console.log(store.getState())
}, 1000);
这将输出

[ 'artical1', 'artical2' ]
[ '@@redux/INIT5.m.i.0.z.9', 'GET_MATCHES', 'SHOW_MATCHES' ]

首先,只调用
put()
不会将put效应传递给传奇频道,除非前面有
yield

其次,
yield
必须在生成器函数中使用,因此需要将
yield put(…)
的调用者及其调用者的调用者更改为生成器函数形式,即

function *(){
  yield anotherGeneratorFunction()
}
下面更改的代码可以正常工作

const{createStore,applyMiddleware}=require('redux'))
const createSagaMiddleware=require('redux-saga')。默认值
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(
减速器,
applyMiddleware(sagaMiddleware)
)
函数*getMatches(操作){
const{searchValue}=action;
生成getArticles(搜索值,函数*(匹配项){
console.log(匹配项)
产生put({type:'SHOW_MATCHES',负载:MATCHES})
})
}
函数*getArticles(输入、回调){
产量延迟(300)
产生回调(filterArticles(输入));
};
功能过滤器部件(输入){
返回['artical1','artical2']
}
函数*rootSaga(){
获取最新数据('GET_MATCHES',getMatches);
}
sagaMiddleware.run(rootSaga)
dispatch({type:'GET_MATCHES',searchValue:'test'})
设置超时(()=>{
console.log(store.getState())
}, 1000);
这将输出

[ 'artical1', 'artical2' ]
[ '@@redux/INIT5.m.i.0.z.9', 'GET_MATCHES', 'SHOW_MATCHES' ]

有几条建议可以让我们从正确的轨道开始:一个动作分派是完全独立于一个传奇故事来处理的,所以把它作为一个基本案例来测试是从哪里开始的。此外,在帖子的代码中还没有动作或动作分派。Redux传奇非常棒,但我会首先关注Redux的动作,让它在减速器上运行。你的根传奇产量可能应该是一个产量,所以它总是执行“takeLatest”。您可能需要
function*getMatches
以便getMatches是一个生成器函数,这样redux传奇的效果就可以工作了。
{type:SHOW_MATCHES,payload:MATCHES}
这不是一个动作?这是一个动作,但是在启动该动作的过程中有很多输入错误。我建议从一个基本测试用例开始,确保您的代码能够正常地通过redux发送操作,而不需要redux传奇。从那里你可以开始理解/删除所有的打字错误。例如,您需要
getMatches
作为生成器函数来产生
put
效果。您还需要明确地告诉生成器生成效果,而不是只调用
put
。即
yieldput({type:“EXAMPLE”,有效载荷:data})
在这种情况下,我不能用
put
调用
yield
,因为我将它传递给
getArticles
,它不是生成器,所以会抛出错误。我的下一个想法是将
调度
功能传递到传奇中,但我不知道如何实现。如果你想让传奇在延迟一段时间后爆发,请使用传奇/effects中的throttle一系列技巧开始正确的轨道:尽管动作调度是完全独立于传奇处理的,因此,将其作为测试的基本情况是从哪里开始。此外,在帖子的代码中还没有动作或动作分派。Redux传奇非常棒,但我会首先关注Redux的动作,让它在减速器上运行。你的根传奇产量可能应该是一个产量,所以它总是执行“takeLatest”。您可能需要
function*getMatches
以便getMatches是一个生成器函数,这样redux传奇的效果就可以工作了。
{type:SHOW_MATCHES,payload:MATCHES}
这不是一个动作?这是一个动作,但是在启动该动作的过程中有很多输入错误。我建议从一个基本测试用例开始,确保您的代码能够正常地通过redux发送操作,而不需要redux传奇。从那里你可以开始理解/删除所有的打字错误。例如,您需要
getMatches
作为生成器函数来产生
put
效果。您还需要明确地告诉生成器生成效果,而不是只调用
put
。即
收益率