如何在嵌套函数中访问Vue实例的data属性(无法使用箭头函数场景)
问题原因及解决方案
你现有代码存在两个核心问题:
- this指向错误
普通函数的this遵循运行时绑定规则,then方法传入的普通回调函数执行时,内部this并不会指向Vue实例,默认绑定到全局对象(严格模式下为undefined),因此this.a操作的并不是Vue的data属性a。
无法使用箭头函数的场景下,可以在myFunc作用域顶部提前缓存Vue实例的指向:
myFunc(){ // 缓存当前Vue实例指向 const vm = this; new Promise(function(resolve,reject){ setTimeout(function(){ resolve(); },1000) }) .then(function(){ // 用缓存的实例修改data属性 vm.a = 10; // 需要读取更新后的值请放在回调内部 console.log(vm.a) }); }
- 异步执行时序问题
Promise.then回调属于异步微任务,包裹的setTimeout属于异步宏任务,二者都会晚于同步代码执行。你现有代码中console.log(this.a)是同步执行语句,运行时回调还未触发,a尚未被赋值,无论指向是否正确都无法读取到更新后的值,需要读取更新后的值时请将日志代码放在then回调内部。
内容的提问来源于stack exchange,提问作者Osman Rafi
相关产品推荐
相关产品推荐

