然后工作,但 await 不适用于 thunk 操作的 Promise

Then works but await doesn't work with Promise from thunk action

提问人:pucca garu 提问时间:4/21/2023 更新时间:4/22/2023 访问量:74

问:

我正在使用 redux/toolkit 并有一个 thunk 操作来请求更新 API,然后进行导航。

我尝试返回一个承诺,以便我可以在导航之前等待操作完成。

问题在 API 调用后开始。如果我使用 Promise 可以正常工作,那么在我之后导航时不会出现任何问题。then

但是当我使用它时,我开始收到内存泄漏警告,并怀疑 Promise 可能在导航之前尚未解决。我尝试将导航设置TimeOut 5s,然后不再有警告。无论 API 调用是否成功,都会出现问题。await dispatch(updatePost())

// Thunk action trying to return a Promise
export function updatePost() {
  return () =>
    services
      .update()
      .then((response: any) => {
         dispatch(updateFn())
         return response?.data
      })
      .catch((error: any) => {
        throw error
      });
}

// This works fine
updatePost().then(() => {
     navigation('/page');
})

// This cause memory leak warnings
await updatePost();
navigation('/page');

我需要使用的原因是我有更多的功能可以与 Promise.all 一起使用。如果您知道有什么问题,请提供帮助。谢谢。await

reactjs redux 承诺 thunk

评论

0赞 Drew Reese 4/22/2023
也许我误解了你的解释,但除了 Promise 链之外,我在这里没有看到任何 Thunk 函数或任何 Redux 代码。你能编辑以更好地澄清你要做什么以及问题是什么吗?另请参阅最小可重现示例dispatch(updateFn())

答:

0赞 Barry Michael Doyle 4/22/2023 #1

这里的问题是这不是一个承诺,所以即使你调用它也不是“真正”有效的,并且会像你期望的那样工作。updatePost.then

您需要更新为如下承诺:updatePost

export async function updatePost() {
  try {
    const response = await services.update();
    dispatch(updateFn());
    return response?.data;
  } catch (error) {
    throw error;
  }
}

现在您可以像这样安全地使用它:

await updatePost();
navigation('/page');