const once = function (fn) {
let cache = false
return function () {
if (!cache) {
cache = true
fn.call()
}
}
}
const resolve = once(function () {
console.log('resolve')
})
const reject = once(function () {
console.log('reject')
})
resolve()
resolve()
reject()
reject()
以上只会输出一个resolve和一个reject。
once 函数逻辑是传入一个函数,并返回一个新函数,利用闭包和一个标志位保证了它包装的函数只会执行一次,也就是确保 resolve 和 reject 函数只执行一次。
Vue2 在处理异步函数中,就使用了该方法以保证函数 resolve 和 reject 只执行一次。