背景: 后端开发, 对 es6 和 vue 有一定了解, 最近正在折腾研究其原理.
问题概述: 在 async 函数中多执行了一个 nextTick, 导致代码执行时机发生变化
点击 btn 触发 onClick, onClick 内部先调用 doSomeThing, 然后执行一个 nextTick1, doSomeThing 为 async 函数, 里面 await 了一个 callback(注意 cb 是普通箭头函数), 里面也有一个 nextTick2.
问题代码预览: https://codepen.io/zymoplastic/pen/XWdrPpj
截取代码如下
<template>
<button @click="onClick(true)">多执行一个 nextTick</button>
<button @click="onClick(false)">少执行一个 nextTick</button>
</template>
{
data() {
return {}
},
methods: {
async doSomeThing(hasOneMoreTick) {
let cb = () => {
console.log('doSomeThing -- cb');
if (hasOneMoreTick) {
this.$nextTick(() => {
console.log('cb $nextTick done');
})
}
}
await cb();
console.log('doSomeThing -- close');
console.log('call destroy');
},
onClick(hasOneMoreTick) {
console.log(`------hasOneMoreTick: ${hasOneMoreTick} begin ------`);
this.doSomeThing(hasOneMoreTick);
this.$nextTick(() => {
console.log('onClick $nextTick done');
console.log('call destroy');
})
}
}
}
疑问:
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.