如何确保在实时 Ajax 搜索中获取最新的搜索结果
How to ensure latest search results are fetched in a live Ajax search
我正在尝试构建一个实时 AJAX 搜索框。我正在使用 keyup() 函数触发搜索 api,并将输入框的当前值作为搜索文本。
但是,由于搜索 api 调用是异步的,因此无法保证最终的 api 调用会被渲染,因为它可能会在之前的 api 调用之前完成。
例如,如果我在输入框中输入"free",将有四个api调用,"search_text" = f,fr,fre & free。 search?search_text=free 调用完成速度可能比 search?search_text=fre api打电话,即使后来被解雇了。我如何确保最终 api 调用(在本例中为搜索?search_text=free)的结果始终呈现在结果页面中?
我见过一些解决方案,他们建议仅针对 稳定的 查询触发请求,即当用户停止输入时(比如 200 毫秒左右)。然而,我认为尽管仍然不能保证在触发 2 个连续的搜索查询时(比如时间延迟 >=200ms),第二个查询的结果 always 最后完成。构建此 ajax 实时搜索的最佳方法是什么?
<input type="text" id="search" name="search" class="form-control input-lg" />
$('#search').keyup(function() {
$.ajax({
type: "POST",
url: "/search/",
data: {
'search_text' : $('#search').val(),
},
success: searchSuccess,
});
});
function searchSuccess(data) {
// logic to render search results to web page
}
let counter = 0; // ADDING A COUNTER
$('#search').keyup(function() {
// INCREASING THE COUNTER VALUE AND STORE IT INTO A LOCAL VARIABLE
let cur = ++counter;
$.ajax({
type: "POST",
url: "/search/",
data: {
'search_text' : $('#search').val(),
},
success: data => {
// CHECKING IF THE LOCAL VARIABLE AND COUNTER ARE EQUAL
if(cur == counter){
// IF EQUAL: IT IS THE LAST QUERY
searchSuccess(data);
} else {
// IF NOT: DON'T DO ANYTHING
return false;
}
}
});
});
function searchSuccess(data) {
// logic to render search results to web page
}
我正在尝试构建一个实时 AJAX 搜索框。我正在使用 keyup() 函数触发搜索 api,并将输入框的当前值作为搜索文本。 但是,由于搜索 api 调用是异步的,因此无法保证最终的 api 调用会被渲染,因为它可能会在之前的 api 调用之前完成。
例如,如果我在输入框中输入"free",将有四个api调用,"search_text" = f,fr,fre & free。 search?search_text=free 调用完成速度可能比 search?search_text=fre api打电话,即使后来被解雇了。我如何确保最终 api 调用(在本例中为搜索?search_text=free)的结果始终呈现在结果页面中?
我见过一些解决方案,他们建议仅针对 稳定的 查询触发请求,即当用户停止输入时(比如 200 毫秒左右)。然而,我认为尽管仍然不能保证在触发 2 个连续的搜索查询时(比如时间延迟 >=200ms),第二个查询的结果 always 最后完成。构建此 ajax 实时搜索的最佳方法是什么?
<input type="text" id="search" name="search" class="form-control input-lg" />
$('#search').keyup(function() {
$.ajax({
type: "POST",
url: "/search/",
data: {
'search_text' : $('#search').val(),
},
success: searchSuccess,
});
});
function searchSuccess(data) {
// logic to render search results to web page
}
let counter = 0; // ADDING A COUNTER
$('#search').keyup(function() {
// INCREASING THE COUNTER VALUE AND STORE IT INTO A LOCAL VARIABLE
let cur = ++counter;
$.ajax({
type: "POST",
url: "/search/",
data: {
'search_text' : $('#search').val(),
},
success: data => {
// CHECKING IF THE LOCAL VARIABLE AND COUNTER ARE EQUAL
if(cur == counter){
// IF EQUAL: IT IS THE LAST QUERY
searchSuccess(data);
} else {
// IF NOT: DON'T DO ANYTHING
return false;
}
}
});
});
function searchSuccess(data) {
// logic to render search results to web page
}