$ interval不会立即取消承诺

时间:2016-10-24 15:35:07

标签: javascript angularjs ionic-framework promise cancellation

我有一个我交换数据的服务,在这个服务中我保留了由$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秒多。我可以控制这种行为吗?

1 个答案:

答案 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启动的异步操作无法停止,但可以取消其承诺链接的操作。