2017-05-24 1 views
1

Mobx-utils/fromPromise.stateは観測できません!なぜ `when`と反応し、` observe`や `intercept`では反応しないのですか?

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) 
 
);
<script src="https://unpkg.com/[email protected]/lib/mobx.umd.js"></script> 
 
<script src="https://unpkg.com/mobx-utils/mobx-utils.umd.js"></script>

答えて

1

result.state観測可能ではありませんが、its implementationを見てみるならば、あなたはresult.stateを行う際には、観察result._stateにアクセスしていることがわかります。

private _state: IObservableValue<PromiseState> = observable(PENDING as any); 
.... 
get state(): PromiseState { 
    return this._state.get(); 
} 

reactionwhen仕事は、彼らはあなたがstateを読んだときに起こる_stateアクセスに反応するので。これは明らかにin the documentationと説明されています。

observeおよびinterceptは、resultが観測できないため機能しません。彼らは、非常にの最初のパラメータがobservableであると期待しています。したがって、更新されたコードでさえも動作しません。result._stateを最初の引数として渡すように修正するには、修正するにはresult._stateを修正してください。

observe(result._state, change => (console.log('observe', change)), true) 
intercept(result._state, change => (console.log('intercept', change))); 
関連する問題