繁体   English   中英

MobX 状态树生成器不允许在成功的承诺中修改状态?

MobX State Tree generator does not allow modified state in a successful promise?

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

通过以下代码,我收到此错误:

error: Error: [mobx-state-tree] Cannot modify 
'AuthenticationStore@<root>', the object is protected and can only be 
modified by using an action.

有问题的代码(生成器):

.model('AuthenticationStore', {
    user: types.frozen(),
    loading: types.optional(types.boolean, false),
    error: types.frozen()
  })
  .actions(self => ({
    submitLogin: flow(function * (email, password) {
      self.error = undefined
      self.loading = true
      self.user = yield fetch('/api/sign_in', {
        method: 'post',
        mode: 'cors',
        headers: {
          'Content-Type': 'application/json',
        },
        body: JSON.stringify({
          'user' : {
            'email': email,
            'password': password
          }
        })
      }).then(res => {
        return res.json()
      }).then(response => {
        self.loading = false // the error happens here!
        return response.data
      }).catch(error => {
        console.error('error:', error)
        // self.error = error
      })
    }), ...

问题是:这在生成器中是不允许的,有没有更好的方法来更新这个特定的状态,还是需要用 try/catch 来包装?

一如既往地感谢任何和所有反馈!

1 个回复

问题是你在fetch()返回的 Promise 上调用then ,你传递给then的函数不是一个动作。 请注意,操作(或流)中运行的函数不算作操作本身。

由于您使用的是yield ,因此您无需调用thencatchfetch()返回的 Promise 。 相反,将其包装在 try/catch 中:

submitLogin: flow(function* (email, password) {
  self.error = undefined;
  self.loading = true;
  try {
    const res = yield fetch('/api/sign_in', {
        method: 'post',
        mode: 'cors',
        headers: {
          'Content-Type': 'application/json',
        },
        body: JSON.stringify({
          'user' : {
            'email': email,
            'password': password
          }
        })
    });
    const response = yield res.json();
    self.loading = false;
    self.user = response;
  } catch(error) {
    console.log('error: ', error);
    self.error = error;
  }
}
1 MobX状态树中带有“流”的生成器语法

我在MobX状态树存储中有三个操作:第一个从API提取数据,第二个使用数据库中API的数据发送POST请求,第三个接收响应并将其保存到存储中。 该存储仅由称为列表的这些数据结构的映射组成: 发送GET和POST请求的前两个动作可以正常工作: 但是,当涉及到第三项操作时,实际 ...

3 为什么seq计算生成器不允许“let!”

我注意到,当您尝试编译时,以下代码会出错: 这给出的错误是“ 错误FS0795:不再允许在序列表达式中使用'let!x = coll'。而是使用'for x in coll'。 ”这条消息当然是清楚的,并演示了如何解决它; 固定代码是: 我的问题不是如何解决这个问题,而是为什么 ...

2012-04-18 08:25:19 1 635   f#
5 MobX 与 MobX 状态树

为什么我应该使用 MobX 状态树而不是普通的 MobX? 似乎每次我读到 MobX 时,都会在同一个地方提到 MST。 是否有人实际使用只是MobX本身? 可能是太笼统的问题... ...

6 Mobx / Mobx状态树中的可重用动作

我有多个mobx商店,发现自己在每个商店中都有几乎相同的动作。 因此,我希望能够在商店之间进行概括和重用。 下面,我试图突破创建动作,希望能够将其导入到多个存储中,但是由于self不可用,因此无法正常工作。 我想从这里开始: 对于这样的情况,可以在其他商店中重用create动作 ...

7 状态-不允许405

我正在为具有硬编码值的示例登录编写代码。 function wrong() { if (confirm("Wrong Credentials! Try again!")) { location.reload() } else { location.reload() } } funct ...

10 如何在Mobx状态树中构建“树”。

我想知道如何在Mobx状态树中正确构建我的树。 我现在有一个页面,您可以选择一个类别,然后您会看到有一个搜索栏和显示的结果。 但是,将有一个显示用户搜索历史的组件。 现在我不确定该SearchHistoryModel应该存放在哪里? 我有一个雇员模型和一个类别模型。 因此, ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM