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