VueJS 异步检测语言与 Yandex Translate API

Posted

技术标签:

【中文标题】VueJS 异步检测语言与 Yandex Translate API【英文标题】:VueJS async detect language with Yandex Translate API 【发布时间】:2019-05-07 20:40:27 【问题描述】:

我正在尝试使用 VueJS 使用 Yandex Translate API 来异步检测输入文本的语言。

一切正常。但有个问题;我写的每封信都会返回日志。

例如,当我写 'hello' 时:api 会预测每个单词 'h'、'he'、'hel'、'hell'、'hello' 的语言并变成 5 log。我想要的是 API 在超时后异步返回 1 条日志来记录“你好”这个词。它检查每个字母。我该如何解决?

TranslateForm.vue 的 html 部分

<template>
    <textarea v-model="translateText" cols="30" rows="5" class="form-control" placeholder="Translate something."></textarea>
</template>

TranslateForm.vue 的脚本部分

import axios from 'axios'
export default 
  name: 'TranslateForm',
  data () 
    return 
      translateText: '',
      apiKey: '********',
      detectLangApiUrl: '***********'
    
  ,
  watch: 
      translateText (value) 
        if (value) 
          axios.post(this.detectLangApiUrl + '?key=' + this.apiKey + '&text=' + value)
            .then(response => 
              console.log(response)
            ).catch(e => console.log(e))
        
      
   

【问题讨论】:

【参考方案1】:

问题是每次更新 translateText 时(每次按键后)您都在调用 API。如果您不想简单地拥有一个按钮,那么一种方法是监听 blur 事件(当用户将注意力移出 textarea 时)然后调用该方法:

<template>
    <textarea v-model="translateText" @blur="translate" cols="30" rows="5" class="form-control" placeholder="Translate something."></textarea>
</template>

<script>
import axios from 'axios'
export default 
  name: 'TranslateForm',
  data () 
    return 
      translateText: '',
      apiKey: '********',
      detectLangApiUrl: '***********'
    
  ,
  methods: 
    translate () 
       if (this.translateText) 
          axios.post(this.detectLangApiUrl + '?key=' + this.apiKey + '&text=' + this.translateText)
            .then(response => 
              console.log(response)
            ).catch(e => console.log(e))
        
    
  

</script>

您还可以使用debounce 函数来限制调用该方法的次数。例如,每秒只调用一次 translate:

<script>
import axios from 'axios'
import  debounce  from 'lodash'

export default 
  name: 'TranslateForm',
  data () 
    return 
      translateText: '',
      apiKey: '********',
      detectLangApiUrl: '***********',
      debouncedTranslate: debounce(() => 
        axios.post(this.detectLangApiUrl + '?key=' + this.apiKey + '&text=' + this.translateText)
            .then(response => 
              console.log(response)
            ).catch(e => console.log(e))
      , 1000)
    
  ,
  watch: 
      translateText (value) 
        if (value) 
          this.debouncedTranslate()
        
      
   

</script>

【讨论】:

以上是关于VueJS 异步检测语言与 Yandex Translate API的主要内容,如果未能解决你的问题,请参考以下文章

Yandex MapKit iOS:集群和地标

与 vuejs 和 laravel 中的不同语言页面交互

Laravel + Vuejs 遇到异步问题

Vuejs:如何在异步导入加载中设置道具值?

javascript Yandex.Maps路由与geo

Vuejs 中的异步和等待