【问题标题】:Promises resolved before all inner promise resolved, multiple async API calls承诺在所有内部承诺解决之前解决,多个异步 API 调用
【发布时间】:2016-12-06 18:27:00
【问题描述】:

您好,我是 react/redux 开发环境的新手,感谢您的帮助。

我试图通过在我的 app.js 中调用 dispatch(fetchAllPositions(selectedUserDivision))componentDidMount 时异步进行 2 个 API 调用

我在this post 中找到了一个建议的方法,fetchAllPositions 函数将两个动作函数包装在一个 Promise.all

export function fetchAllPositions(division) {
  return dispatch => Promise.all([
        dispatch(fetchUserPositionsIfNeeded(division)),
        dispatch(fetchDefaultPositionsIfNeeded(division))
    ])
    .then(console.log("fetched both"))
}

这两个动作函数几乎相同,只是调用的 API url 略有不同。其中一个如下所示,其中shouldFetchUserPosition 只是一个返回布尔值的纯函数:

function fetchUserPositions(division) {
  return dispatch => {
      const url = apiOptions.server + `/api/user/position?division=${division}`
      dispatch(requestUserPositions(division))
    return fetch(url, options)
      .then(response => response.json())
      .then(json => dispatch(receiveUserPositions(division,json)),
        err => console.log(err))

  }
}

export function fetchUserPositionsIfNeeded(division) {
  return (dispatch, getState) => {
    if (shouldFetchUserPositions(getState(), division)) {
      return dispatch(fetchUserPositions(division))
    } else {
      return Promise.resolve()
    }
  }
}

逻辑是,对于更新,在拉取数据时发送REQUEST... 操作,然后在数据准备好更新到新状态时发送RECEIVE... 操作。

问题是Promise.all 应该等待REQUEST1 REQUEST2 RECEIVE1 RECEIVE2 所有人都进来之后才执行.then(console.log("fetched both"))

现在,是在前 2 个 REQUEST 完成后的 .then,而不是等待 2 个 RECEIVE 进来。

我怀疑这是 requestUserPositions() 在包装 fetch() 的函数中的嵌套性质

REQUEST 动作是一个简单的函数,在 reducer 中它只是将 isFetching 属性翻转为 true

function requestUserPositions(division) {
  return {
    type: REQUEST_USER_POSITIONS,
    division
  }
}

对于这个冗长的问题,我深表歉意,但如果有任何建议,我将不胜感激。

【问题讨论】:

    标签: reactjs redux redux-thunk


    【解决方案1】:

    这是一个粗心的错误

    事实证明,当.then() 被包装在一个调度中时,它会在执行Promise.all() 的同时被执行。

    通过将then(()=>console.log 标记为从ComponentDidMount 完成的最后一次调度dispatch(fetchAllPositions(selectedUserDivision)) 来创建预期的调度顺序

    【讨论】:

      猜你喜欢
      • 2015-06-24
      • 1970-01-01
      • 2021-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-02
      • 1970-01-01
      相关资源
      最近更新 更多