Promise resolve 传递问题
问题背景:在使用vee-validate的时候,需要通过ajax实时检测用户输入值是否已存在,自定义了一个异步检测规则,并使用了事件节流
因为事件节流的原因,我将检测函数抽出来,并想通过将参数保存在this中进行传递,可是结果并不像我想的那样
async function check() {
const res = await Vue.prototype.$api.checkIfParamsValueExist(this.key, this.value)
let valid = res ? res.info : true
this.resolve({
valid,
data: valid ? '' : { message: '已存在' }
})
}
Validator.extend('notExist', {
getMessage: (field, params, data) => {
return (data && `${field} ${data.message}`) || 'Something went wrong';
},
validate: (value, [key]) => {
return new Promise(resolve => {
console.log(value)
this.value = value
this.key = key
this.resolve = resolve
console.log('resolve', resolve)
throttle(check, this, 800)
})
}
});
在进行表单验证的时候v一直在pending中,无法执行到then里面,可是我在上面已经resolve了
const v = this.$validator.validateAll()
console.log(v)
v.then((result) => {
console.log('validateAll result', result)
})
如果我直接将check函数定义在给节流函数传参的时候是会可以正常运转的,但这样节流函数就没作用了
Validator.extend('notExist', {
getMessage: (field, params, data) => {
return (data && `${field} ${data.message}`) || 'Something went wrong';
},
validate: (value, [key]) => {
return new Promise(resolve => {
throttle(async function() {
const res = await Vue.prototype.$api.checkIfParamsValueExist(key, value)
console.log(res)
let valid = res ? res.info : true
resolve({
valid,
data: valid ? '' : { message: '已存在' }
})
}, this, 800)
})
}
});
附事件节流函数
function throttle(method, context, time = 100) {
if (method.tId) {
return
}
method.tId = setTimeout(() => {
method.call(context)
clearTimeout(method.tId)
method.tId = 0
}, time)
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
原因是节流函数没有每次都resolve,修改后没问题了