2

我在面试时遇到了这个 ajax 问题:

我们有这段代码,其中 onChange 进行了 AJAX 调用(到 asdf 服务器),它也进行了另一个 AJAX 调用(到 qwer 服务器),

 function onDescription(description) {
    var content = $('').text(description);
    $('#results').append(content);
}

    function onSearchResults(searchResults){
        $('#results').html('');
        $.each(searchResults, function(result){
            $.ajax({
                url: 'http://qwer.com/describe',
                dataType: 'json',
                data: result,
                success: onDescription
            });
        });
    }

    function onChange(){
        $.ajax({
            url:'http:://asdf.com/search',
            dataType: 'json',
            data: $('#search').val(),
            success: onSearchResults
        });
    }

$('#search').keydown(onChange);

问题是:如果用户以不同的速度输入文本会发生什么。

1- asdf 服务器将超载 2- 当用户非常快速地输入文本时,不会显示来自 qwer 的描述 3- 将显示预览搜索的结果而不是当前 4- 来自 qwer 的当前搜索查询的描述是显示在对 asdf 的请求之前

对我来说,即使是选择也不是很清楚。所以在你看来,如果我们有一个嵌套的 AJAX 调用和不同的输入速度会发生什么?

4

1 回答 1

3

以上都不是。AJAX 被设计为非确定性的。如果用户开始输入“moon”,则会向 asdf 发送四个请求:“m”、“mo”、“moo”和“moon”。但是结果返回的顺序是不确定的。服务器可能需要不同的时间来响应每个请求。您可以按“moo”、“m”、“moon”、“mo”的顺序获得响应。随着打字速度的变化,结果可能会改变,但这取决于.

安全的做法是忽略先前查询的结果。这是一个快速修复:

function onDescription(description) {
    var content = $('').text(description);
    $('#results').append(content);
}

var searchResultQuery = '';
function onSearchResults(query){
    searchResultQuery = query;
    return (function(query) {
        return function(searchResults) {
            if (query != searchResultQuery) {
                return;
            }
            $('#results').html('');
            $.each(searchResults, function(result){
                $.ajax({
                    url: 'http://qwer.com/describe',
                    dataType: 'json',
                    data: result,
                    success: onDescription
                });
            });
        };
    })(query);
}

function onChange(){
    $.ajax({
        url:'http:://asdf.com/search',
        dataType: 'json',
        data: $('#search').val(),
        success: onSearchResults($('#search').val())
    });
}

$('#search').keydown(onChange);
于 2013-09-21T23:15:56.500 回答