2

我想知道如何中止请求。

例如,我发出App.MyModel.find(),后来我想在它从服务器返回之前取消/中止它。我会期待这样的事情:

var res = App.MyModel.find();   //request sent to server
res.abort();                    // abort the request before completion

但这不起作用 - 返回的对象是 apromise并且既没有abort也没有cancel方法。

澄清

我正在寻找如何abort在底层XMLHttpRequest对象上调用该方法。

4

3 回答 3

8

对于那些想知道如何做到这一点的人,这里是我取消 jquery ajax 请求的方法。

首先,我在我的应用商店中定义了一个新方法,它将在我的自定义 RESTAdapter 上调用 cancelQuery。

App.Store = DS.Store.extend({
  cancelQuery: function(type){
    var adapter = this.adapterFor(this.modelFor(type).modelName);
    if(typeof adapter.cancelQuery === 'function'){
      adapter.cancelQuery();
    }
  }
});

在我的自定义 RESTAdapter 中,我定义了这个新函数并像这样覆盖 ajaxOptions:

App.YOURMODELAdapter = DS.RESTAdapter.extend({
  jqXHRs: [],
  ajaxOptions: function(url, type, hash) {
    // Get default AjaxOptions
    var ajaxOptions = this._super(url, type, hash);

    // If the function was defined in the DS.RESTAdapter object,
    // we must call it in out new beforeSend hook.
    var defaultBeforeSend = function(){};
    if(typeof ajaxOptions.beforeSend === 'function'){
      defaultBeforeSend = ajaxOptions.beforeSend;
    }
    ajaxOptions.beforeSend = function(jqXHR, settings){
      defaultBeforeSend(jqXHR, settings);
      this.jqXHRs.push(jqXHR); // Keep the jqXHR somewhere.
      var lastInsertIndex = this.jqXHRs.length - 1;
      jqXHR.always(function(){
        // Destroy the jqXHRs because the call is finished and 
        // we don't need it anymore.
        this.jqXHRs.splice(lastInsertIndex,1);
      });
    };

    return ajaxOptions;
  },
  // The function we call from the store.
  cancelQuery: function(){
    for(var i = 0; i < this.jqXHRs.length; i++){
      this.jqXHRs[i].abort();
    }
  }
});

现在,您可以cancelQuery在控制器的上下文中调用。

this.store.cancelQuery('yourmodel');
于 2014-06-02T23:15:52.560 回答
0

我相信,当你打电话时App.MyModel.find(),它会返回你 a RecordArray,而不是 a promise

通过查看 RESTAdapter 的 ember-data 源代码,我认为没有办法在您的XMLHttpRequest对象上调用 abort。

您可以实现自己的 RESTAdapter:

var myRESTAdapter = DS.Adapter.create({
  find: function (store, type, id) {
    var req = $.ajax({
      url:      type.url,
      dataType: 'jsonp',
      context:  store,
      success:  function(response){
        this.load(type, id, response.data);
      }
    });
    req.abort();
  },
  findAll: function(store, type) {
    var req = $.ajax({
      url:      type.url,
      dataType: 'jsonp',
      context:  store,
      success:  function(response){
        this.loadMany(type, response.data);
      }
    });
    req.abort();
  }
});

XMLHttpRequest并在对象中调用 abort 。

于 2013-02-18T02:33:22.227 回答
-1

Http是请求-响应交互。请求一旦发送,就无法取消。你可以通过一些方式忽略服务器的响应;

于 2013-02-17T10:29:17.183 回答