Promise resolve 传递问题

发布于 2022-09-07 20:03:34 字数 1892 浏览 23 评论 0

问题背景:在使用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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

冷月断魂刀 2022-09-14 20:03:34

原因是节流函数没有每次都resolve,修改后没问题了

function throttle(method, context, time = 100) {
  if (method.tId) {
    return context.resolve({
      valid: true,
      data: ''
    })
  }
  method.tId = setTimeout(() => {
    method.call(context)
    clearTimeout(method.tId)
    method.tId = 0
  }, time)
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文