淘汰赛:Ajax 请求中止

Posted

技术标签:

【中文标题】淘汰赛:Ajax 请求中止【英文标题】:knockout : Ajax request abort 【发布时间】:2018-09-13 07:01:23 【问题描述】:

我想在新请求运行时阻止以前的 ajax 请求。我这样做就像下面的代码。但是,它不起作用。

我在 beforeSend() 函数中添加了用于中止先前请求的代码。但是,这行不通。

请帮我解决这个问题。

jQuery :

return Component.extend(
    defaults: 
        changeTextValue: ko.observable(),
        currentRequest: ko.observable(),
        anotherObservableArray: [],
        subscription: null,
        tracks: 
            changeTextValue: true
        
    ,
    initialize: function() 
        this._super();
    ,
    doSomething: function(config) 
        var self = this;
        if (this.subscription)
            this.subscription.dispose();

        this.subscription = this.changeTextValue.subscribe(function(newValue) 
            this.currentRequest = $.ajax(
                url: urlBuilder.build('abc/temp/temp'),
                type: 'POST',
                data: JSON.stringify(
                    'searchtext': newValue
                ),
                global: true,
                contentType: 'application/json',
                beforeSend: function(jqXHR) 
                    console.log("before Ajax send");
                    console.log(this.currentRequest);
                    if (this.currentRequest != null) 
                        this.currentRequest.abort();
                    
                ,
                success: function(response) 
                    var json_data = JSON.parse(response);
                    self.autocompleteData.removeAll();
                    $.each(json_data, function(key, val) 
                        self.autocompleteData.push(
                            productID: val.productID
                        );
                    );
                ,
                error: function(jqXHR, exception) 
                    alert("Not OK!")
                
            );
        );
    ,
);
ko.applyBindings(new CeremonyViewModel());

【问题讨论】:

【参考方案1】:

所以我猜你想在再次调用subscribe 函数时取消之前的请求,对吗?

在这种情况下,如果再次调用 subscribe,请尝试中止它。

return Component.extend(
    defaults: 
        changeTextValue: ko.observable(),
        currentRequest: null,
        anotherObservableArray: [],
        subscription: null,
        tracks: 
            changeTextValue: true
        
    ,
    initialize: function() 
        this._super();
    ,
    doSomething: function(config) 
        var self = this;
        if (this.subscription)
            this.subscription.dispose();

        this.subscription = this.changeTextValue.subscribe(function(newValue) 
            if (self.currentRequest) 
                self.currentRequest.abort();
            
            self.currentRequest = $.ajax(
                url: urlBuilder.build('abc/temp/temp'),
                type: 'POST',
                data: JSON.stringify(
                    'searchtext': newValue
                ),
                global: true,
                contentType: 'application/json',
                success: function(response) 
                    var json_data = JSON.parse(response);
                    self.autocompleteData.removeAll();
                    $.each(json_data, function(key, val) 
                        self.autocompleteData.push(
                            productID: val.productID
                        );
                    );
                ,
                error: function(jqXHR, exception) 
                    alert("Not OK!")
                
            );
        );
    ,
);
ko.applyBindings(new CeremonyViewModel());

【讨论】:

不工作 :( kotemplate.js:96 Uncaught TypeError: self.currentRequest.abort is not a function 能否请您检查并给我其他解决方案,如果工作? 嗨.. 不幸的是,如果不亲自调试代码,我无法进一步说明解决方案可能是什么。有没有机会以某种方式给我拉链? 问题是你将 currentRequest 初始化为 ko.observable() => 这不是 null 但也没有一个名为 abort() 的函数。您应该将初始化从 currentRequest: ko.observable() 更改为 currentRequest: null @MariusJunak 哦,是的,好点,我没有注意到就复制了。

以上是关于淘汰赛:Ajax 请求中止的主要内容,如果未能解决你的问题,请参考以下文章

带有 ajax 的淘汰赛3+select2 (v4)

ajax发布后淘汰js更新视图模型

修复 JQM ajax 单页导航上的淘汰多个绑定

MVC 淘汰赛选择标签值赋值

在页面加载中默认调用更改事件 - 淘汰赛

淘汰赛和 Select2 获得选定的对象