jQuery UI自动完成:中止请求

mpe*_*pen 6 ajax jquery jquery-ui-autocomplete

我正在使用source执行ajax请求的选项的回调版本.我想如果用户在ajax请求完成之前快速连续输入一堆字母,我们应该中止旧的并且只使用新的.我假设source参数的URL版本会自动执行此操作,但由于我使用的是自定义回调,因此我必须手动执行此操作.

所以这就是我所拥有的:

$('#myselector').autocomplete({
    source: function(request, response) {
        var data = {};
        if($(this).data('xhr')) {
            console.log('aborting...');
            $(this).data('xhr').abort();
        }
        // *snip* add some stuff to data
        $(this).data('xhr', $.ajax({
            url: '/ajax/major_city',
            dataType: 'json',
            data: data,
            success: function(data, textStatus, $xhr) {
                response(data);
            },
            complete: function($xhr, textStatus) {
                console.log(textStatus);
                if(textStatus === 'abort') {
                    console.log('aborted!');
                    response([]);
                }
            }
        }));
    },
// ....
Run Code Online (Sandbox Code Playgroud)

因此,每当触发"源"回调时,它会检查该输入是否存在XHR元素(第一次未定义),如果是,则中止它(侧问:如何检查请求是否完整?没有意义尝试已经完成的中止请求).

文档说:

在提供自定义源回调以处理请求期间的错误时,这很重要.即使遇到错误,也必须始终调用响应回调.这可确保窗口小部件始终具有正确的状态.

因此,在我的代码底部,您将看到我(尝试)检查请求是否已中止,如果是,我返回一个空列表.但那"中止了!" 似乎永远不会被称为日志.即使它被中止,它总是说"成功".为什么?


编辑:刚试过输出$(this).data('xhr').readyState.它似乎永远不会比4我建议的那样,source直到最后一个请求返回响应才被再次调用.这是一种耻辱,因为我们可以提前中止请求并加快响应时间......

bdp*_*ish 0

您是否无法设置等待用户“看起来”完成输入的时间间隔?“延迟”选项设置在搜索之前输入最后一个字母后等待的毫秒数。

此外,即使您从服务器返回“中止”,响应仍然会成功。因为请求在服务器上没有出错。你返回我假设的值“abort”。