【发布时间】:2019-06-15 11:59:27
【问题描述】:
如果我的应用程序有足够多的用户,每次击键都发送一个 ajax 请求是一种让服务器瘫痪的有效方法(更不用说可能让客户端应用程序感觉很慢)。关于实现具有两个选项(DB 搜索和 Web Api 搜索)的符号搜索框。当我在搜索框中输入符号(例如:AAPL - aple stock)时,每次都会通过网络发送fetch() 请求。为了避免它,我尝试使用setTimeout(),但fetch() 请求被发送多次,无论如何。如何延迟/开始/去抖动获取请求,直到用户停止在输入区域输入以仅发送一个 fetch() 请求?
HTML:
<label for="symbolTags">Symbol: </label>
<input type="text" id="symbolTags" name="symbol">
<label for="api">Select Search Api: </label>
<select id="api" name="routes_api">
<option value="search">Web Search Api</option>
<option value="dbsearch">DB Search Api</option>
</select>
JavaScript:
const symbolTags = document.querySelector('#symbolTags')
const symbolTagsOptions = document.querySelector('#api')
const urlsObject = {
dbsearch: '/dbsearch/',
search: '/search/'
}
symbolTags.oninput = function () {
let symbolTagsOptionsValue = symbolTagsOptions.value
let arg = urlsObject[symbolTagsOptionsValue]
// Init a timeout variable to be used below
let timeout = null
// Clear the timeout if it has already been set.
// This will prevent the previous task from executing
// if it has been less than <MILLISECONDS>
clearTimeout(timeout)
// Make a new timeout set to go off in 2000ms
timeout = setTimeout(function () {
requestSymbolSearch(arg)
}, 2000)
}
function requestSymbolSearch(arg) {
getData(arg)
.then(data => {
console.log(data)
$('#symbolTags').autocomplete({
source: data.map(item => item.symbol),
autoFocus: true
})
})
.catch(error => console.error('Error:', error))
}
function getData(url) {
let curValueSymbol = symbolTags.value
let urlPlus = `${url}${curValueSymbol}`
console.log(urlPlus)
return fetchData(urlPlus)
}
async function fetchData(urlPlus) {
const dataResponse = await fetch(urlPlus)
const dataJson = await dataResponse.json()
return dataJson
}
这是控制台结果:
这是网络结果:
【问题讨论】:
-
如何使用最小输入长度,例如
fetch只有在输入n个字符后才会发出请求 -
@brk 问题,它也可能是一个字母符号
标签: javascript node.js