Reactjs 如果一个API调用取决于另一个API调用返回的内容,如何在redux操作中调用两个API?

Reactjs 如果一个API调用取决于另一个API调用返回的内容,如何在redux操作中调用两个API?,reactjs,redux,react-redux,Reactjs,Redux,React Redux,我需要在redux操作中调用第二个API,该API需要使用从第一个API返回的变量 我尝试使用.then(),但无法获取从第一个返回的数据 export const getLoginCredential=()=>dispatch=>{ 取回(“http://localhost:3500/login", { 方法:“张贴”, 标题:{ “内容类型”:“应用程序/json” }, 正文:JSON.stringify({“EID”:“123”,“appName”:“myapp”}) }) .then(

我需要在redux操作中调用第二个API,该API需要使用从第一个API返回的变量

我尝试使用.then(),但无法获取从第一个返回的数据

export const getLoginCredential=()=>dispatch=>{
取回(“http://localhost:3500/login", {
方法:“张贴”,
标题:{
“内容类型”:“应用程序/json”
},
正文:JSON.stringify({“EID”:“123”,“appName”:“myapp”})
})
.then(res=>res.json())
。然后(数据=>{
派遣({
类型:登录用户,
有效载荷:数据
})
让罗莱德;
data.userRoleLinkDTO.map(角色=>{
if(role.isDefault==“Y”){
roleId=role.roleId;
}
})
返回roleId;
})
。然后(id=>{
console.log(id);
取回(“http://localhost:3500/", {
方法:“张贴”,
标题:{
“内容类型”:“应用程序/json”
},
正文:JSON.stringify({“data”:[{“name”:“getThings”,“urlparmeter”:{“appId”:“1”,“userId”:“1234”,“roleID”:id},“parameter”:“}]”)
})
})
.then(res=>res.json())
.然后(数据=>dispatch({
类型:获取角色菜单,
有效载荷:数据
}))
.catch(err=>console.log(err))
}
在我的第二个API调用中,我想使用我想从中返回的roleId
。然后(数据=>{
派遣({
类型:登录用户,
有效载荷:数据
})

})

正如您所发现的,已调度的操作不会可靠地返回您所期望的内容。虽然不一定如此,但我从不使用操作的返回值。您可以做的是创建一个新的操作,从您的第一次调用中接受
roleId
。从技术上讲,您可以在一个函数中完成它,但我认为这在逻辑上是合理的

类似的东西应该可以满足你的需要

const fetchUserRole = ({roleId}) => dispatch => {
  fetch("http://localhost:3500/", {
    method: "POST",
    headers: {
      "content-type": "application/json"
    },
    body: JSON.stringify({ "data": [{ "name": "getList", "urlparameter": { "appId": "1", "someId": "555", "roleID": roleId }, "parameter": "" }] })

  })
    .then(res => res.json())
    .then(data => dispatch({
      type: FETCH_ROLE_MENU,
      payload: data
    }))
}

export const getLoginCredential = () => dispatch => {
  fetch("http://localhost:3500/login", {
    method: "POST",
    headers: {
      "content-type": "application/json"
    },
    body: JSON.stringify({ "EID": "444", "appName": "my-project.com" })

  })
    .then(res => res.json())
    .then(data => {
      dispatch({
        type: LOGIN_USER,
        payload: data
      })
      const roleId = getLastMatchingRoleId(data) // line added from your clarification
      dispatch(fetchUserRole({ roleId }))
    })
}
仅供参考,您没有包括
roleId
的来源。我想你是在样本中没有显示的地方处理的

更新: 您的实现看起来只是试图在数组中找到与
role.isDefault==“Y”
匹配的项的最后一个实例,以获取
roleId
。这只是一个算法挑战,与redux无关

Array#map
用于创建数组的新实例<代码>数组#forEach是专为您的用例设计的可枚举项

我的建议是创建一个helper函数,为您找到合适的
roleId
。这不是什么新鲜事。我只是将您现有的逻辑更改为在每个(适当的可枚举项)之前使用
,并将其转换为一个函数

function getLastMatchingRoleId(data) {
  let roleId;
  data.userRoleLinkDTO.beforeEach(role => {
    if (role.isDefault === "Y") {
      roleId = role.roleID;
    }
  })
  return roleId;
}

您所需要做的就是将其纳入我现有的答案(我已在上面更新)

如果这不能回答您的问题,您能否详细说明您关于
//的问题?这里我想映射我的数据并返回roleId,以便我可以在第二次API调用中使用它
?谢谢!你能看看我更新的帖子吗?我给我的问题添加了更多…@AnnahI更新