我正在使用延迟承诺来中止$http
请求(如本文所述)。
但是,我不确定应该如何传播abort()
在根级别添加的函数。每次我调用.then()
promise 时,都会返回一个新的 promise(没有abort()
函数)。
请参阅下面的示例。我有一个控制器调用一个服务,然后调用另一个服务($http
发出请求的地方)。该示例不起作用,因为promise
inMyController
与返回的 in 不同restService
,因此没有称为 的函数abort()
。
- 我如何传播该
abort()
功能以便它在 中可用MyController
? - 我可以一直返回原始承诺,然后调用
then()
它(就像在底部的示例中一样)?电话会发生什么then()
?它们是否仍然“同步”调用?
控制器
app.controller("MyController", function($scope, dataService) {
var promise;
$scope.loadAndAbortData = function () {
promise = dataService.getData().then(updateUI);
};
$scope.abort = function () {
if (promise) {
promise.abort();
}
};
}
数据服务
app.service("dataService", function(restService) {
var service = {
getData: function () {
return restService.get().then(function (response) {
var modifiedData = modifyData(response.data);
return modifiedData;
}, function (response) {
handleError(response.data);
$q.reject(response.data);
});
};
};
return service;
}
休息服务:
app.service("restService", function($http, $q) {
var service = {
get: function () {
var deferredAbort = $q.defer();
var request = $http.get(url, { timeout: deferredAbort.promise } );
promise.abort = function () {
deferredAbort.resolve();
}
return promise;
};
};
return service;
}
这是 DataService 和 MyController 的解决方案吗?
app.controller("MyController", function($scope, dataService) {
var promise;
$scope.loadAndAbortData = function () {
promise = dataService.getData();
promise.then(updateUI);
};
$scope.abort = function () {
if (promise) {
promise.abort();
}
};
}
app.service("dataService", function(restService) {
var service = {
getData: function () {
var promise = restService.get();
promise.then(function (response) {
var modifiedData = modifyData(response.data);
return modifiedData;
}, function (response) {
handleError(response.data);
$q.reject(response.data);
});
return promise;
};
};
return service;
}