首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么对“工作时”和“观察”或“调解”没有反应?

为什么对“工作时”和“观察”或“调解”没有反应?
EN

Stack Overflow用户
提问于 2017-05-24 23:28:33
回答 1查看 337关注 0票数 1

Mobx/Mobx状态是不可观察的!

代码语言:javascript
复制
const { observable, when, reaction, intercept, observe, isObservable } = mobx;
const { fromPromise, whenWithTimeout } = mobxUtils;

const promise = fetch('https://jsonplaceholder.typicode.com/todos')
  .then(res => res.json())
const result = fromPromise(promise);

console.assert(isObservable(result.state), 'state is NOT an isObservable');

/* WORKS!
when(
  () => result.state !== "pending",
  () => {
    console.log("Got ", result.value)
  }
);
*/

// NOT WORK, Why ?
observe(result, 'state', change => (console.log('observe', change)), true)
intercept(result, 'state', change => (console.log('intercept', change)));
reaction(
  () => result.state,
  state => console.log('reaction', state)
);
代码语言:javascript
复制
<script src="https://unpkg.com/mobx@3/lib/mobx.umd.js"></script>
<script src="https://unpkg.com/mobx-utils/mobx-utils.umd.js"></script>

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-05-31 03:09:04

result.state是不可观测的,但是如果您查看其实施情况,就会发现当您执行result.state时,它将访问可观察的result._state

代码语言:javascript
复制
private _state: IObservableValue<PromiseState> = observable(PENDING as any);
....
get state(): PromiseState {
    return this._state.get();
}

reactionwhen之所以工作是因为它们会对_state访问做出反应,而当您读取state时就会发生这种情况。在文件中清楚地解释了这一点。

observeintercept不能工作,因为result是不可观察的。他们期望自己的第一个参数是一个可观测的。因此,即使是更新的代码也无法工作。

代码语言:javascript
复制
observe(result, '_state', change => (console.log('observe', change)), true)
intercept(result, '_state', change => (console.log('intercept', change)));

要修复它,请将result._state作为第一个参数传递。

代码语言:javascript
复制
observe(result._state, change => (console.log('observe', change)), true)
intercept(result._state, change => (console.log('intercept', change)));
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44170032

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档