我有一个我交换数据的服务,在这个服务中我保留了由$interval
创建的承诺,没有什么花哨的:
$rootScope.recursivePosition = null;
$rootScope.trackMe = function(){
var extensionName = $state.current.extensionName;
if ($rootScope.tracking === false) {
$rootScope.tracking = true;
$rootScope.recursivePosition = $interval(function(){
someService.getAllPositions($rootScope.content[extensionName]);
}, 2000);
} else {
$interval.cancel($rootScope.recursivePosition);
console.log("recursivePosition cancel");
console.dir($rootScope.recursivePosition);
$rootScope.tracking = false;
}
};
问题是,在该服务中,我有另一个承诺(来自$cordovaGeolocation
),当我取消第一个承诺($rootScope.recursivePosition
)时,它仍然可以工作一段时间,比如4秒多。我可以控制这种行为吗?
答案 0 :(得分:0)
承诺中的承诺无法取消。但是可以取消从该承诺中获得的承诺。
function getAllPositions(x) {
var defer = $q.defer();
var derivedPromise = defer.promise;
derivedPromise.cancel = function () {
defer.reject('cancelled');
});
$cordovaGeolocation(x)
.then(function onSuccess(value) {
defer.resolve(value);
}).catch(function onReject(error) {
defer.reject(error);
});
return derivedPromise;
};
上面的示例返回从$cordovaGeolocation
承诺派生的承诺。附加到它的是一个名为cancel
的方法,如果在$cordovaGeolocation
结算之前调用,它将拒绝承诺。
$cordovaGeolocation
启动的异步操作无法停止,但可以取消其承诺链接的操作。