Ember-中止ajax请求

Ember-中止ajax请求,ajax,xmlhttprequest,ember.js,ember-data,Ajax,Xmlhttprequest,Ember.js,Ember Data,我想知道如何中止请求 例如,我发布了App.MyModel.find(),稍后我想在它从服务器返回之前取消/中止它。我希望这样: var res = App.MyModel.find(); //request sent to server res.abort(); // abort the request before completion 但这不起作用-返回的对象是一个promise,没有abort或cancel方法 澄清 我正在寻找如何调用底层XM

我想知道如何中止请求

例如,我发布了
App.MyModel.find()
,稍后我想在它从服务器返回之前取消/中止它。我希望这样:

var res = App.MyModel.find();   //request sent to server
res.abort();                    // abort the request before completion
但这不起作用-返回的对象是一个
promise
,没有
abort
cancel
方法

澄清
我正在寻找如何调用底层
XMLHttpRequest
对象上的方法。

Http是请求-响应交互。一旦发送请求,它就不能被取消。您可以通过某种方式忽略来自服务器的响应

我相信,当你调用
App.MyModel.find()
时,它会返回一个
记录数组
,而不是
承诺

通过查看RESTAdapter的余烬数据源代码,我认为没有办法在
XMLHttpRequest
对象上调用abort

您可以实现自己的重新适应程序:

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。

对于那些想知道如何做的人,下面是我如何取消jquery ajax请求的

首先,我在应用程序存储中定义了一个新方法,该方法将在我的自定义RestaAdapter上调用cancelQuery

App.Store = DS.Store.extend({
  cancelQuery: function(type){
    var adapter = this.adapterFor(this.modelFor(type).modelName);
    if(typeof adapter.cancelQuery === 'function'){
      adapter.cancelQuery();
    }
  }
});
在我的自定义RestaAdapter中,我定义了该新函数并覆盖如下AjaxOption:

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

请看我的说明。承诺对象(RSVP)应该允许取消请求并触发拒绝或失败事件。Lol,HTTP请求不能中止是什么意思?为什么您认为请求首先会发送到服务器?此外,即使在服务器上正在处理HTTP请求时,您也可以取消该请求(想想流)。OP问题对于清理、用户中止或路由切换/控制器重置场景来说是非常合法的。只是好奇,你的用例是什么?为什么要中止它?我想在加载之前突然不需要它时中止它以进行清理。一种可能的情况是用户转到另一条路线。为什么在
ajax
call之后调用
abort
?它不应该被存储吗?我想告诉你一种中止请求的方法。这并不意味着您必须在ajax调用之后调用abort。这意味着您可以以任何方式处理它。当尝试在原始方法之外调用abort时,这没有帮助。这是一个不错的解决方案,在您希望终止所有传出连接的情况下效果很好,与“resetController”期间一样,一个问题是中止jqXHR实际上会触发失败处理程序,并在路由上导致错误。通过添加检查statusText!=这里描述的“中止”:漂亮的捕获!如果确实重写了错误处理程序,请确保在状态为!=”时调用默认的错误处理程序中止'。我对beforeSend处理程序使用了类似的技巧。是的。同样,我也不太确定,但是如果在适配器上下文之外调用
beforeSend
,则
this.jqXHRs
可能无法正常工作。为返回对象之外的对象创建一个闭包可能是明智的。(例如,
jqXHRs=this.jqXHRs
ajaxOptions.beforeSend
函数之外。ajaxOptions函数中的重写错误似乎没有多大作用,因为它将在RESTAdapters ajax函数中被重写。您好,这段代码正在使用ember v1.8.1和ember数据beta19。如果不是这样的话,他们从那时起做了重大更改在你的版本上工作,也许你可以接受代码并根据你的需要修改它。
this.store.cancelQuery('yourmodel');