2

リクエストを中止する方法を知りたい。

たとえば、発行App.MyModel.find()した後、サーバーから戻る前にキャンセル/中止したい。私はこのようなものを期待します:

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

ただし、これは機能しません。返されるオブジェクトはapromiseであり、メソッドabortcancelメソッドもありません。

明確化

abort基になるXMLHttpRequestオブジェクトのメソッドを呼び出す方法を探しています。

4

3 に答える 3

8

それを行う方法を疑問に思っている人のために、これが私がjqueryajaxリクエストをキャンセルするために達成した方法です。

まず、カスタム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()を返すだろうと信じています。RecordArraypromise

RESTAdapterの残り火データのソースコードを見ると、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();
  }
});

オブジェクトでabortを呼び出しXMLHttpRequestます。

于 2013-02-18T02:33:22.227 に答える
-1

Httpは要求と応答の相互作用です。要求が送信されると、キャンセルすることはできません。代わりに、サーバーからの応答を無視する方法を使用できます。

于 2013-02-17T10:29:17.183 に答える