代码之家  ›  专栏  ›  技术社区  ›  Keval Mehta

淘汰:Ajax请求中止

  •  1
  • Keval Mehta  · 技术社区  · 6 年前

    我想在运行新请求时阻止以前的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 回复  |  直到 6 年前
        1
  •  1
  •   Ray    6 年前

    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());