我有一个将对象放在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()中是不可能的。
答案 0 :(得分:1)
您正在失去this
当您调用cb()
progressCB()
时,但在此函数中this
不是商店实例。
尝试:
putThingInFirebase(thing, this.progressCB.bind(this));
//or
putThingInFirebase(thing, (x) => this.progressCB(x));
既然你回复了一个承诺.then()
,为什么不把这个方法放在那里呢?而不是还添加回调函数?