javascript - 链式 jQuery promises with abort

标签 javascript jquery ajax promise

我目前正在编写 API 代码,其中包含多层深度的 $.ajax() 调用。

一个要求是用户必须能够取消任何请求(例如,如果它花费的时间太长)。

通常这是通过一些简单的事情来完成的,比如:

var jqXHR = $.ajax(..);
$(mycancelitem).click(function () {
     jqXHR.abort();
});

但是我的代码看起来更像这样:

function myapicall() {

    var jqxhr = $.ajax(…);
    var prms = def.then(function (result) {
        // modify the result here
        return result + 5;
    });

    return prms;
}

这里的问题是调用 myapicall() 的人只得到一个 jQuery.Promise,没有办法中止它。虽然上面的示例非常简单,但在我的实际代码中,在很多地方都有多层链接。

有解决办法吗?

最佳答案

我的解决方案灵感来自所有

使用 jQuery promise

客户端.js

var self = this;
function search() {
  if (self.xhr && self.xhr.state() === 'pending') self.xhr.abort();
  var self.xhr = api.flights(params); // Store xhr request for possibility to abort it in next search() call
  self.xhr.then(function(res) {
    // Show results
  });
}
// repeatedly call search()

API.js

var deferred = new $.Deferred();
var xhr = $.ajax({ });
xhr.then(function (res) { // Important, do not assign and call .then on same line
  var processed = processResponse(res);
  deferred.resolve(processed);
});
var promise = deferred.promise();
promise.abort = function() {
  xhr.abort();
  deferred.reject();
};
return promise;

使用 Q + jQuery promise

客户端.js

var self = this;
function search() {
  if (self.xhr && self.xhr.isPending()) self.xhr.abort();
  var self.xhr = api.flights(params); // Store xhr request for possibility to abort it in next search() call
  self.xhr.then(function(res) {
    // Show results
  });
}
// repeatedly call search()

API.js

var deferred = Q.defer();
var xhr = $.ajax({ });
xhr.then(function (res) { // Important, do not assign and call .then on same line
  var processed = processResponse(res);
  deferred.resolve(processed);
});
deferred.promise.abort = function() {
  xhr.abort();
  deferred.reject();
};
return deferred.promise;

关于javascript - 链式 jQuery promises with abort,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21766428/

相关文章:

javascript - 结合图片上传ajax和表单提交ajax

php - PHP:显示来自Web服务的图像

javascript - Kendo Grid 中的日期字段在 Controller 上为空

javascript - 在数组中添加整数的问题

javascript - Angularjs PATCH - undefined 不是函数

javascript - 浏览器状态 - Javascript/JQuery

javascript - jquery.mentionsInput 在移动设备上不起作用

javascript - SailsJS - 无法加载静态文件

Javascript/Jquery : if rel is found then append data, 否则,不要附加数据

javascript - 在 symfony Controller 中使用 ajax 处理 $_POST