Я использую отложенное обещание, чтобы прервать запрос $http
(как описано в этот пост).
Однако я не уверен, как мне распространять функцию abort()
, добавленную на корневой уровень. Каждый раз, когда я вызываю .then()
для обещания, возвращается новое обещание (без функции abort()
).
Смотрите мой пример ниже. У меня есть контроллер, вызывающий службу, которая, в свою очередь, вызывает другую службу (где делается запрос $http
). Пример не работает, так как promise
в MyController
не совпадает с тем, что было возвращено в 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;
}