2016-02-20 18 views
22

Bir React Uygulamanız var, Redux ile bir çevrimiçi hizmete (async) ajax çağrısı yapmam (öğrenebilmek için) yapmam gerekiyor. Redux'daki Async eylemleri

import { createStore, applyMiddleware } from 'redux'; 
import thunk from 'redux-thunk'; 
import duedates from './reducers/duedates' 


export default applyMiddleware(thunk)(createStore)(duedates); 

Bu

eylemleri olduğunu:

Bu

benim dükkanım

import rest from '../Utils/rest'; 

export function getDueDatesOptimistic(dueDates){ 
    console.log("FINISH FETCH"); 
    console.log(dueDates); 
    return { 
     type: 'getDueDate', 
     dueDates 
    } 
} 

export function waiting() { 
    console.log("IN WAIT"); 
    return { 
     type: 'waiting' 
    } 
} 


function fetchDueDates() { 
    console.log("IN FETCH"); 
    return rest({method: 'GET', path: '/api/dueDates'}); 
} 

export function getDueDates(dispatch) { 
    console.log("IN ACTION"); 
    return fetchDueDates().done(
     dueDates => dispatch(getDueDatesOptimistic(dueDates.entity._embedded.dueDates)) 
    ) 
} 

Ve bu düşürücüdür: Ben yanlış ne yapıyorum alamadım

export default (state = {}, action) => { 
    switch(action.type) { 
    case 'getDueDate': 
     console.log("IN REDUCER") 

     return state.dueDates = action.dueDates; 
    default: 
     return state 
    } 
} 

. Eylem, bileşenden mükemmel şekilde çağrılıyor. Ama sonra bu hatayı alıyorum:

Error: Actions must be plain objects. Use custom middleware for async actions.

ben yanlış tepki-thunk ortakatmanını kullanıyorum sanırım. Neyi yanlış yapıyorum? DÜZENLEME

Şimdi eylem redüktör sesleniyor, fakat redüktör, devlet değiştirdikten sonra yeniden çalışmadığı Sana compose kullanarak gerektiğini düşünüyorum yöntem

case 'getDueDate': 
     console.log("IN REDUCER") 

     return state.dueDates = action.dueDates; 

cevap

24

hale

import { 
    createStore, 
    applyMiddleware, 
    compose 
} from 'redux'; 
import thunk from 'redux-thunk'; 
import duedates from './reducers/duedates' 

export default compose(applyMiddleware(thunk))(createStore)(duedates); 

Thunk pl bir eylem yaratıcısı yerine bir işlev döndürecek sağlayan gibi işlev, böylece olduğundan ain-nesne, sen bir Promise nesnesi dönmekte olan

export function getDueDates() { 
    return dispatch => { 
    console.log("IN ACTION"); 
    fetchDueDates().done(
     dueDates => dispatch(getDueDatesOptimistic(dueDates.entity._embedded.dueDates)) 
    ) 
    }; 
} 

gibi kullanabilirsiniz, böylece bu sorunun bir parçası oldu. Başka bir kısım, redux-thunk'ın düzgün bir şekilde uygulanmadığıydı. Ben compose bahsettiğim problemin çözülmesini istiyorum.

+0

Büyük çalışır, şimdi çalışıyor gibi görünüyor. ama redüktörde, 'geri döndüğümde' devleti döndürürüm.dueDates = action.dueDates; ', tekrar çağrılmıyor .. Başka bir şey eklemeliyim mi? – Pablo

+0

Şu anda, kod örneğinizde, her iki eylem de durumu değiştirmiyor. Devleti geri veriyorsun. Sorularınızı güncelleyebilir miyim, böylece mevcut durumu görebilir miyim? –

+0

güncellendi, şimdi dönüyorum state.dueDates = action.dueDates; ' – Pablo

11

Kabul edilen yanıt ya modası geçmiş, yanlış ya da aşırı kıvrımlıdır.

http://redux.js.org/docs/api/compose.html

yüzden artık şöyle yapabiliriz: Burada oluşturma konuyla ilgili dokümanlar şunlardır

import {createStore, combineReducers, compose, applyMiddleware} from 'redux'; 
import thunk from 'redux-thunk'; 

const reducer = combineReducers({ 
    user: userReducer, 
    items: itemsReducer 
}); 


// here is our redux-store 
const store = createStore(reducer, 
    compose(applyMiddleware(thunk)) 
); 
0

Ben de compose fonksiyonunu kullanmadan bir çalışma sorununa çözüm bulmak için mümkün olduğuna inanıyoruz . redux-thunk

Çözüm GitHub repo belgelere dayanarak redux-thunk: ^2.0.0

import { createStore, applyMiddleware } from 'redux'; 
import thunk from 'redux-thunk'; 
import duedates from './reducers/duedates' 

export function configureStore(initialState = {}) { 
    return createStore(
    duedates, 
    initialState, 
    applyMiddleware(thunk) 
); 
} 
+0

Hey, Kevin, ama 'yaratıcısı' nereden geliyor? –

+0

HI @RishatMuhametshin, Yukarıdaki örneği düzelttim. "createReducer", boilerplate kodundan kaçınmak ve [react-boilerplate] 'den alınan bir işlevdi (https://github.com/react-boilerplate/react-boilerplate/blob/master/app/reducers.js) –