调用的突变返回false,但对象是在数据库中创建的

Posted

技术标签:

【中文标题】调用的突变返回false,但对象是在数据库中创建的【英文标题】:Mutation called returns false, but the object is created in DB 【发布时间】:2020-03-20 01:21:40 【问题描述】:

我在 ReactJS 中构建了一个模式,并在提交按钮上添加了 handleClick。

    const handleSubmit = async (event) => 
    event.preventDefault();
    const res = await createApp(variables: id, name, url);
    console.log('response' + res)
    console.log('loading' + loading);
    console.log('called' + called);
    console.log('error' + error)
    console.log('data' + data)
  

在第一次点击时,我得到了

 response[object Object]
 loadingfalse
 calledfalse
 errorundefined
 dataundefined

在第二次点击时,我得到了

response[object Object]
loadingfalse
calledtrue
errorundefined
data[object Object]

但是,在第一次点击时正在 DB 中创建正确的对象!

【问题讨论】:

【参考方案1】:

从您的问题中不清楚您是如何获得loadingerrorcalleddata 变量的,但我假设它来自useMutation 钩子。但是,如果您使用的是Mutation 组件,则以下说明仍然适用。

useMutation 钩子返回一个包含函数和MutationResult 对象的数组,其中包括loadingerrorcalleddata 等属性。这些属性被公开是为了方便更新组件的 UI,然而,它们只是普通的component state。因此,对它们的任何更改都是异步的,就像setState 一样。

换句话说,您可以调用并等待createApp,这样做的结果是,上述属性将最终更新。但是,不能保证他们会在createApp 返回的 Promise 解析之前更新。因此,即使您正在等待对createApp 的调用,这些属性中的每一个的值都尚未更新。如果不是将它们记录在单击处理程序中,而是将它们呈现在组件中,那么您会认为它们发生了适当的变化。

如果您需要在点击处理程序中访问您的操作返回的数据,您可以从已解析的 Promise 的值中进行操作:

const  data, error  = await createApp(variables: id, name, url);

// Note: loading and called are not exposed similarly because that would be moot --
// if the promise has resolved, the function was called and you're no longer loading

【讨论】:

谢谢你这么棒的解释,丹尼尔!这正是问题所在!

以上是关于调用的突变返回false,但对象是在数据库中创建的的主要内容,如果未能解决你的问题,请参考以下文章

即使令牌是在邮递员中创建的,JWT 令牌也会返回空

如何使在 ddply 中创建的对象在函数外部可用(在全局环境中)?

确定用户在 SQL Server 中创建的对象

ProgrammingError:对象是在线程 id 14408 中创建的,这是线程 id 2776。我无法创建帐户

如何调用在另一个函数中创建的对象

我的照片是在第2页中创建的,但之后创建的段落是在插入之后(第1页)