2017-01-03 54 views
2

我正嘗試從web api調用加載數據,爲此我添加了兩個動作之一,用於調用另一個用於加載數據的webapi方法。我的操作是這樣的: -無法在react-redux中的動作中調用另一個動作

export function LoadLabResult (labresult) { 

    return (dispatch) => { 
    dispatch({ 
     type: 'RECEIVE_LABRESULT', 
    }); 

    fetch('http://localhost:8090/api/Requisition/GetRequisitionTestInfo', {mode: 'no-cors'}) 
    .then(response =>dispatch({ 
     type: 'REQUEST_LABRESULT', 
     labresult:response.data 
     })); 

    } 
}; 
export function receiveLabResult(labresult) { 
console.log(labresult); 
    return { 
    type:'REQUEST_LABRESULT', 
    labresult:labresult 
    }; 
} 

現在的問題是,它不調用receiveLabResult method.How我能做到這一點?我如何將數據傳遞給labresult

+0

從我understod,你要派遣API調用之前的動作''RECEIVE_LABRESULT''再一次API調用完成後,派遣行動''REQUEST_LABRESULT''。那是對的嗎 ? – Swapnil

+0

@swapnil在調用api調用之後我想啓動REQUEST_LABRESULT,但它沒有正確的數據發射,我通過調試數據來檢查數據是否來自json。如何將數據傳遞給其他動作並激發? – jack123

+0

我認爲你使用的是不正確的術語。您創建的方法是動作創建者而不是動作。動作創作者觸發動作。在你的情況下,**我沒有看到需要調用loadLabResult **內的receiveLabResult動作創建器。關於API調用數據,你有沒有嘗試在各自的reducer中安裝action.labresult? – Swapnil

回答

-1

正確的方法是,您必須通過傳遞該response.data,直接在API成功處理程序之後調用方法receiveLabResult

當您想要進入Reducer或通知Reducer關於分派時,您返回一個類型爲Action的對象。所以,你必須寫下面的代碼,使其工作:

export function LoadLabResult (labresult) { 
 

 
    return (dispatch) => { 
 
    dispatch({ 
 
     type: 'RECEIVE_LABRESULT', 
 
    }); 
 

 
    fetch('http://localhost:8090/api/Requisition/GetRequisitionTestInfo', {mode: 'no-cors'}) 
 
    .then(response =>dispatch(receiveLabResult(response.data)); 
 

 
    } 
 
}; 
 
export function receiveLabResult(labresult) { 
 
console.log(labresult); 
 
    return { 
 
    type:'REQUEST_LABRESULT', 
 
    labresult:labresult 
 
    }; 
 
}

1

案例1:如果你想從另一個調用行動的創建者行動的創建者,喲可以直接調用該操作的功能呼叫。

export function LoadLabResult (labresult) { 

    return (dispatch) => { 
    dispatch(receiveLabResult()); 
    } 
}; 
export function receiveLabResult(labresult) { 
console.log(labresult); 
    return { 
    type:'REQUEST_LABRESULT', 
    labresult:labresult 
    }; 
} 

案例2: ,如果你想從組件使用派遣將從Redux的使用connect()函數來調用注入動作的創造者。

編輯配置終極版咚中間件

//Middleware 
const middleware = [ 
    thunk, 
    promiseMiddleware() 
]; 

// Apply all the middleware for Redux 
const enhancers = composeEnhancers(
    applyMiddleware(...middleware) 
); 

// Create the Redux Store 
const store = createStore(rootReducer, initialState, enhancers); 
+0

@kahlid通過上面的代碼錯誤來到:Uncaught TypeError:dispatch不是函數 – jack123

+0

我這樣寫:then(response => dispatch(receiveLabResult(response.data)));但錯誤即將到來,如派遣不是一個功能。 – jack123

+1

您需要使用redux-thunk作爲動作創建者內部的異步動作,將redux-thunk配置爲使用分派的中間件。 –

0

Finally I got the solution:-

我的第一個動作會是這樣: -

export function LoadAllLabResult (selectedUserId) { 
    return (dispatch) => { 
    dispatch({ 
     type: REQUEST_LABRESULT,//defining the name of the action to identify in the reducer 
    }); 

    fetch(APIPATH+'data/LoadTestInfo?patientVisitId='+selectedUserId)//calling the service 
    .then((response) => response.json()) 
    .then((labresult) => dispatch(receiveLabResult(labresult)));//passing the data to other actions 
    } 
} 

我的第二個行動將是這樣的: -

export function receiveLabResult(labresult) { 
     return { 
     type:RECEIVE_LABRESULT,//defining the name of the action to identify in the reducer 
     labresult:labresult//passing the data to reducer 
     }; 
    } 

現在從減速,我們將調用操作爲: -

import { 
    RECEIVE_LABRESULT, 
    REQUEST_REQUISITION 
} from '../../../Constant/actionType' 
//define the initail state for the reducer 
var initialState={ 
    labresult: [], 
    loadinglabResult: true 
} 
//call the action to update the sate 
function labResultReducer(state =initialState, action) { 
    switch (action.type) { 
    case RECEIVE_LABRESULT: 
     return Object.assign({}, state, { 
      labresult: action.labresult, 
      loadinglabResult: false, 
     }); 
    case REQUEST_REQUISITION: 
     return Object.assign({}, state, { 
      loadinglabResult: true 

     }); 

    default: 
     return state; 
    } 
} 
export default labResultReducer; 
相關問題