2017-09-03 1 views
0

React/Redux 응용 프로그램에서 작업 중입니다. 사용자 주소를 삭제해야합니다. redux saga를 미들웨어로 사용하고 있습니다. 기능은 정상적으로 작동하지만 주소를 삭제하면 요청이 입력되지 않습니다. 가 deleteAddressByBuyerIdAddressIdSuccess이 (saga.js 파일), 그것은, 하나는이 문제를 밖으로 정렬하는 데 도움이 수 (REDUX 개발자 도구에서 확인했다)에만 deleteAddressByBuyerIdAddressIddeleteAddressByBuyerIdAddressIdFailure에 진입 redux saga deleting functionality

내 모든 기능과 redux 개발자 도구의 스크린 샷은 다음과 같습니다.

활동 파일

/* Delete an address for a buyer */ 
const deleteAddressByBuyerIdAddressId = 
    (buyerId: string, addressId: string, address: Object, params: string) => ({ 
     type: Types.DELETE_ADDRESS_BY_BUYER_ID_ADDRESS_ID, 
     buyerId, 
     addressId, 
     address, 
     params, 
    }); 

const deleteAddressByBuyerIdAddressIdSuccess = 
    (buyerId: string, addressId: string, address: Object, params: string) => ({ 
     type: Types.DELETE_ADDRESS_BY_BUYER_ID_ADDRESS_ID_SUCCESS, 
     buyerId, 
     addressId, 
     address, 
     params, 
    }); 

const deleteAddressByBuyerIdAddressIdFailure = 
    (errorMessage: Object) => ({ 
     type: Types.DELETE_ADDRESS_BY_BUYER_ID_ADDRESS_ID_FAILURE, 
     errorMessage, 
    }); 

사가 파일

/* Delete Buyers address */ 
function* deleteAddressByBuyerIdAddressId(action) { 
    try { 
     const response = yield call(
      api.account.deleteAddressByBuyerIdAddressId, 
      action.buyerId, 
      action.addressId, 
      action.address, 
      action.params 
     ); 
     if (response.ok && response.data && {}.hasOwnProperty.call(response.data, 'data')) { 
      yield put(
      Actions.deleteAddressByBuyerIdAddressIdSuccess(
       action.buyerId, 
       action.addressId, 
       response.data, 
       action.address, 
       action.params 
     ) 
    ); 
     } else { 
      yield put(Actions.deleteAddressByBuyerIdAddressIdFailure(response.errorMessage)); 
     } 
    } catch (error) { 
     yield put(Actions.deleteAddressByBuyerIdAddressIdFailure(error)); 
    } 
} 
function* watchDeleteAddressByBuyerIdAddressId(): Generator<void, void, void> { 
    yield takeLatest(Types.DELETE_ADDRESS_BY_BUYER_ID_ADDRESS_ID, deleteAddressByBuyerIdAddressId); 
} 

기어

export const deleteAddressByBuyerIdAddressId = (state: Object = INITIAL_STATE) => ({ 
    ...state, 
    isLoading: true, 
    successMessage: null, 
    errorMessage: null, 
}); 

export const deleteAddressByBuyerIdAddressIdSuccess = (state: Object = INITIAL_STATE, action: Object) => { 
    const successMessage = I18n.getText('account.address-deleted', {}, 'Address deleted!'); 
    return { 
     ...state, 
     address: action.address, 
     successMessage: successMessage, 
     } 
}; 

export const deleteAddressByBuyerIdAddressIdFailure = (state: Object = INITIAL_STATE, action: Object) => ({ 
    ...state, 
    errorMessage: action.errorMessage, 
    isLoading: false, 
}); 

REDUX 개발자 도구 당신은 그 if, else 부분이 필요하지 않습니다

enter image description here


+0

프로그램이 catch 중이거나 진행 중입니까? –

+2

예, 사용자 프로그램을 삭제 한 후 응답이 null이기 때문에 내 프로그램이 catch 또는 else 블록에 있습니다. 미리 감사드립니다. – wali

+2

응답이 'NULL'이면 'call' 함수에 문제가있을 수 있습니다. –

답변

1

볼 수 있습니다. 대신 요청이 성공한 경우 try 블록 내에서 success 액션을 호출하기 만하면됩니다. 그렇지 않으면 귀하의 catch 블록 내부에서 실패 조치가 호출됩니다. 그것은 당신을 위해 일을 할 것입니다. 다음은 샘플 코드입니다.

/* Delete Buyers address */ 
function* deleteAddressByBuyerIdAddressId(action) { 
    try { 
     const response = yield call(
      api.account.deleteAddressByBuyerIdAddressId, 
      action.buyerId, 
      action.addressId, 
      action.address, 
      action.params 
     ); 
      yield put(
      Actions.deleteAddressByBuyerIdAddressIdSuccess(
       action.buyerId, 
       action.addressId, 
       response.data, 
       action.address, 
       action.params 
     ) 
    ); 
    } catch (error) { 
     yield put(Actions.deleteAddressByBuyerIdAddressIdFailure(error)); 
    } 
} 
function* watchDeleteAddressByBuyerIdAddressId(): Generator<void, void, void> { 
    yield takeLatest(Types.DELETE_ADDRESS_BY_BUYER_ID_ADDRESS_ID, deleteAddressByBuyerIdAddressId); 
} 
관련 문제