Mobx传递回调以更新进度而不让我实时更新可观察的

时间:2018-05-04 02:27:21

标签: observable mobx mobx-react

我有一个将对象放在firebase存储中的功能。这个函数接受一个回调,让我回过头来跟踪它。我想将此进展存储在一个observable中,但是当我尝试通过回调更新observable时,我收到的错误是我的observable未定义。下面是一个剥离的例子:

function putThingInFirebase(thing, cb) {
  // ...
  const videoUploadTask = videoStorageRef.put(thing)
  videoUploadTask.on('state_changed', snap => {
  let progress = (snap.bytesTransferred / snap.totalBytes) * 100
  cb(Math.round(progress)) // callback from my store
  // handle errors and such
  // ....


// my store
class store {
  @observable progress
  @action upload(thing) {
     putThingInFirebase(thing, this.progressCB)
        .then(...)
  }
  progressCB(x) { // ive tried @action and @action.bound
    this.progress = x // here i get errors that this.progress is undefined yet when i do a console.log, x is being updated as expected
  }
}

我期望发生的是通过回调更新的observable。 我得到的是this.progress未定义。

我的问题是:更新此observable的正确方法是什么,以便我可以监控上传的进度?

谢谢你们的时间和帮助!

编辑:乔尔是对的。请看下面我的评论,但真正的罪魁祸首!

关于使用promise中的解决方案的建议,不幸的是我需要访问'state_changed'监听器,这在.then()中是不可能的。

1 个答案:

答案 0 :(得分:1)

您正在失去this

的背景

当您调用cb() progressCB()时,但在此函数中this不是商店实例。

尝试:

putThingInFirebase(thing, this.progressCB.bind(this));

//or
putThingInFirebase(thing, (x) => this.progressCB(x));

额外建议

既然你回复了一个承诺.then(),为什么不把这个方法放在那里呢?而不是添加回调函数?