为何useMutation不返回Promise?无法用await获取结果的疑问
问题原因与解决办法
原因
useMutation返回的默认mutate函数并不返回Promise,它的设计逻辑是通过回调函数(如onSuccess、onError)或者组件内的状态(data、error、isLoading)来处理请求结果,而非直接支持await语法,所以你无法用await获取它的执行结果,VS Code的类型提示也会明确这一点。
解决办法
方法1:使用mutateAsync(推荐)
useMutation同时提供了mutateAsync方法,它专门返回Promise,完全支持await语法,适配你的异步函数写法。
修改代码如下:
// 替换mutate为mutateAsync const { mutateAsync } = useMutation(add_order); const myPostFunction = async () => { try { const result = await mutateAsync(itemsForOrder) console.log(result) } catch (error) { console.error(error); } };
方法2:手动封装Promise(不推荐,仅作补充)
如果因为某些原因必须使用mutate,可以手动将其封装为Promise,利用mutate的回调参数来控制Promise的状态:
const { mutate } = useMutation(add_order); const myPostFunction = async () => { try { const result = await new Promise((resolve, reject) => { mutate(itemsForOrder, { onSuccess: (data) => resolve(data), onError: (error) => reject(error) }); }); console.log(result); } catch (error) { console.error(error); } };
这种写法本质上是用Promise包裹了mutate的回调逻辑,虽然能实现需求,但不如mutateAsync简洁直观,优先推荐第一种方法。
内容的提问来源于stack exchange,提问作者Nikon George
相关产品推荐
相关产品推荐

