rick&morty api问题,要求提供ID字符

时间:2018-12-30 15:24:02

标签: javascript redux-saga

我想提出关于api rick和morty的请求。要获取字符的详细信息,必须指定一个id作为参数:https://rickandmortyapi.com/api/character/id

我使用redux-saga提取请求,但请求失败并显示一条消息:    “嘿!不允许该参数,请尝试输入数字;)”

我尝试使用组件中收到的ID进行请求,该请求有效。我认为这要么是我的举动,要么是我的传奇。

这是我的动作:

export const getCharactersDetails = () => {
  return { type: GET_CHARACTER_DETAILS }
}     

这是我的传奇:

const getLatestDetails = (id) => 
fetch('https://rickandmortyapi.com/api/character/' + id);


export function* fetchCharacterDetails() {
 try {

let myCharacter;
const response = yield call(getLatestDetails);
const result = yield response.json();

if (result.error) {
  yield put({ type: DETAILS_REQUEST_FAILED, error: result.error });
} else {
  myCharacters = result.results
  yield put({ type: DETAILS_RECEIVED, character: myCharacter });
}

} catch (error) {
  yield put({ type: DETAILS_REQUEST_FAILED, error: error.message });
}

}

function* actionWatcher() {
 yield takeLatest(GET_CHARACTERS, fetchCharacters)
 yield takeLatest(GET_CHARACTER_DETAILS, fetchCharacterDetails)
}    

我这样称呼我的行动:

let CharacterId = this.props.navigation.state.params.id
this.props.dispatch(getCharactersDetails(CharacterId))

知道我在做什么不对吗?

1 个答案:

答案 0 :(得分:2)

您没有将任何ID传递给getLatestDetails函数。

将ID添加到您要创建的操作中:

export const getCharactersDetails = id => {
  return { type: GET_CHARACTER_DETAILS, id }
}     

...然后将动作的ID作为参数添加到您的传奇中,并将其作为第二个参数传递给您的call效果:

export function* fetchCharacterDetails({ id }) {
  try {
    let myCharacter;
      const response = yield call(getLatestDetails, id);
      const result = response.json();

      if (result.error) {
        yield put({ type: DETAILS_REQUEST_FAILED, error: result.error });
      } else {
        myCharacters = result.results
        yield put({ type: DETAILS_RECEIVED, character: myCharacter });
      }
    } catch (error) {
      yield put({ type: DETAILS_REQUEST_FAILED, error: error.message });
    }
}

其他说明:

  • 传奇故事以行动作为论点;我们在这里使用解构来获取ID(请注意花括号)
  • call接受将函数称为第一个参数,然后再将其他参数传递给该函数,这就是getLatestDetails如何获取ID的方法
  • 我在yield之前删除了response.json(),这只是普通的同步操作