2

在这个类中,我使用初始化的 bool 状态来产生 Mobx.autorun 执行。否则 'this' 没有被完全赋值并导致错误。是否有另一种/更清洁的方法来做到这一点?

class GameMaster{

  private _initialized:boolean = false;
  private _store:IDomainStore;
  private _moveDisposer:Lambda;

  /**
   *
   * @param store - client or server store
   */
    constructor(store:IDomainStore){
        this._store = store;
        console.log(this._store);
        //todo abstract services to decouple client device from GameMaster because it is also used on the server.
        this._moveDisposer = autorun(()=>{
          // prevent firing in the constructor
          if(this._initialized) {
            this.present(
              <IIntent>{
                fromId: 'GeoLocation.service',
                toIds: [Meteor.userId()],
                wish: actions.playerActions.types.CHANGE_PLAYER_GEO_COORDINATES,
                data: [System.GeolocationService.coordinates.lng, System.GeolocationService.coordinates.lat]
            });
          }
        });
        this._initialized = true;
      }

    public present(intent:IIntent):boolean{
      ...
    }
 ...
}

这是我在另一个文件中观察到的:

 @observable coordinates = {
    lng:0,
    lat:0
  };
4

1 回答 1

3

我认为这是解决问题的好方法,但是初始化的字段也应该是可观察的。否则更改_initialized不会导致自动运行重新运行。

但在那种情况下,我不确定初始化变量在你的身上究竟实现了什么,因为你在自动运行之后的第一条语句是将初始化设置为 true?

所以我不完全确定你要实现什么:将自动运行/present调用推迟到构造函数的末尾,还是跳过第一次present调用?

更新的答案

如果你想防止副作用(present在这种情况下发送),有一个简单的模式。线索是确保您计算副作用所需的任何值,但不要自己触发副作用。所以在你的例子中,这看起来

constructor(store:IDomainStore){
    let firstRun = true;
    this._moveDisposer = autorun(()=>{
        // make sure all information is tracked
        const presenceInfo = <IIntent>{
            fromId: 'GeoLocation.service',
            toIds: [Meteor.userId()],
            wish: actions.playerActions.types.CHANGE_PLAYER_GEO_COORDINATES,
            data: [System.GeolocationService.coordinates.lng, System.GeolocationService.coordinates.lat]
        }
        // but prevent the side effect in the first run
        if(!firstRun) {
            this.present(presenceInfo);
        } else {
            firstRun = false;
        }
    });
  }

(请注意,将来可能不再需要该标志,因为存在将参数传递给自动运行函数的现有提议)。firstRun

于 2016-05-04T11:41:23.877 回答