$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 链接的操作。