$interval 不会立即取消承诺
$interval does not cancel promise right away
我有一个交换数据的服务,在这个服务中我信守 $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 秒以上。我可以控制这种行为吗?
无法取消承诺中的承诺。但是可以取消从该承诺派生的承诺。
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;
};
上面的例子 returns 一个从 $cordovaGeolocation
promise 派生的 promise。附加到它的是一个名为 cancel
的方法,如果在 $cordovaGeolocation
解析之前调用,它会拒绝承诺。
无法停止由 $cordovaGeolocation
启动的异步操作,但可以取消与其 promise 链接的操作。
我有一个交换数据的服务,在这个服务中我信守 $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 秒以上。我可以控制这种行为吗?
无法取消承诺中的承诺。但是可以取消从该承诺派生的承诺。
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;
};
上面的例子 returns 一个从 $cordovaGeolocation
promise 派生的 promise。附加到它的是一个名为 cancel
的方法,如果在 $cordovaGeolocation
解析之前调用,它会拒绝承诺。
无法停止由 $cordovaGeolocation
启动的异步操作,但可以取消与其 promise 链接的操作。