javascript – 使用具有异步功能的MobX @action装饰器和

我正在使用MobX 2.2.2来尝试在异步动作中改变状态.我的MobX的useStrict设置为true.
@action someAsyncFunction(args) {
  fetch(`http://localhost:8080/some_url`,{
    method: 'POST',body: {
      args
    }
  })
  .then(res => res.json())
  .then(json => this.someStateProperty = json)
  .catch(error => {
    throw new Error(error)
  });
}

我得到:

Error: Error: [mobx] Invariant failed: It is not allowed to create or change state outside an `action` when MobX is in strict mode. Wrap the current method in `action` if this state change is intended

我需要将@action装饰器提供给第二个.then语句吗?任何帮助将不胜感激.

解决方法

Do I need to supply the @action decorator to the second .then statement? Any help would be appreciated.

这是非常接近实际的解决方案.

.then(json => this.someStateProperty = json)

应该

.then(action(json => this.someStateProperty = json))

记住,行动可以以许多方式被称为@action不排除.从the docs on action

动作(fn)
> action(name,fn)
> @action classMethod
> @action(name)classMethod
> @action boundClassMethod =(args)=> { 身体 }
> @action(name)boundClassMethod =(args)=> { 身体 }

是将功能标记为动作的所有有效方式.

这是一个解决方案:http://jsbin.com/peyayiwowu/1/edit?js,output

mobx.useStrict(true);
const x = mobx.observable(1);

// Do async stuff
function asyncStuff() {
  fetch('http://jsonplaceholder.typicode.com/posts')
    .then((response) => response.json())
    // .then((objects) => x.set(objects[0])) BREAKS
    .then(mobx.action((objects) => x.set(objects[0])))
}

asyncStuff()

至于为什么你的错误实际上发生了,我猜测,顶级的@action不递归地装饰任何函数作为它的装饰的函数内的动作,这意味着你的匿名函数传递到你的承诺不是一个真正的行动.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


kindeditor4.x代码高亮功能默认使用的是prettify插件,prettify是Google提供的一款源代码语法高亮着色器,它提供一种简单的形式来着色HTML页面上的程序代码,实现方式如下: 首先在编辑器里面插入javascript代码: 确定后会在编辑器插入这样的代码: <pre
这一篇我将介绍如何让kindeditor4.x整合SyntaxHighlighter代码高亮,因为SyntaxHighlighter的应用非常广泛,所以将kindeditor默认的prettify替换为SyntaxHighlighter代码高亮插件 上一篇“让kindeditor显示高亮代码”中已经
js如何实现弹出form提交表单?(图文+视频)
js怎么获取复选框选中的值
js如何实现倒计时跳转页面
如何用js控制图片放大缩小
JS怎么获取当前时间戳
JS如何判断对象是否为数组
JS怎么获取图片当前宽高
JS对象如何转为json格式字符串
JS怎么获取图片原始宽高
怎么在click事件中调用多个js函数
js如何往数组中添加新元素
js如何拆分字符串
JS怎么对数组内元素进行求和
JS如何判断屏幕大小
js怎么解析json数据
js如何实时获取浏览器窗口大小
原生JS实现别踩白块小游戏(五)
原生JS实现别踩白块小游戏(一)