如何获取角度$ interval的状态 - 检查间隔是否已被取消

Maw*_*awg 5 promise angularjs

我是Angular(和JS)的新手,只是有点困惑.

我启动一个计时器:

var getOverviewMapTimer = $interval($scope.UpdateOverviewMap, UPDATE_FREQUENCY); 
Run Code Online (Sandbox Code Playgroud)

而且,如果我理解,那getOverviewMapTimer就是"承诺".

我希望能够检查是否计时器正在运行和已经例外,如果我曾经
$interval.cancel(getOverviewMapTimer);那么getOverviewMapTimernull,我可以检查那个.

事实似乎并非如此.

我是否必须明确地销毁这个承诺(什么是对取消定时器的承诺?).如果是这样,那么我将如何明确地将其设置为null

认为我应该使用cancel(getOverviewMapTimer);,但不是100%确定,因为getOverviewMapTimer之后仍然是非空的.

谢谢你的帮助

gka*_*pak 15

var getOverviewMapTimer = $interval(...); getOverviewMapTimer保持对一个对象的引用(即恰好是一个承诺).

执行$interval.cancel(getOverviewMapTimer)传递(并取消)getOverviewMapTimer变量引用的对象,但无法将对象转换为null.该getOverviewMapTimer变量将继续持有该承诺的对象,并设置为null的唯一途径一提的是,通过一个新的任务(即明确地将它设置为null):

var getOverviewMapTimer = $interval(...);
...
$interval.cancel(getOverviewMapTimer);
getOverviewMapTimer = null;
Run Code Online (Sandbox Code Playgroud)

高级主题:

有一个简单的方法可以找出是否已取消间隔承诺(例如cancelled,在取消间隔时将自定义属性添加到promise对象并将其值设置为true),这听起来确实不错.
Angular非常酷,非常灵活且可扩展,因此使用Service Decorator的概念,我们能够"扩充" $interval服务,扩展其cancel()方法以添加cancelled属性并true在取消间隔承诺时设置其值:

/* Service Decorators can be configured in `config` blocks */
app.config(function ($provide) {

    /* Register a decorator for the `$interval` service */
    $provide.decorator('$interval', function ($delegate) {

        /* Keep a reference to the original `cancel()` method */
        var originalCancel = $delegate.cancel;

        /* Define a new `cancel()` method */
        $delegate.cancel = function (intervalPromise) {

            /* First, call the original `cancel()` method */
            var retValue = originalCancel(intervalPromise);

            /* If the promise has been successfully cancelled,
             * add a `cancelled` property (with value `true`) */
            if (retValue && intervalPromise) {
                intervalPromise.cancelled = true;
            }

            /* Return the value returned by the original method */
            return retValue;
        };

        /* Return the original (but "augmented") service */
        return $delegate;
    });
});
Run Code Online (Sandbox Code Playgroud)

现在,我们可以$interval像往常一样使用该服务,我们总是可以检查interval-promise的cancelled属性,以确定它是否已被取消.

var getOverviewMapTimer = $interval(...);
...
console.log(!!getOverviewMapTimer.cancelled);   // false
$interval.cancel(getOverviewMapTimer);
console.log(!!getOverviewMapTimer.cancelled);   // true
Run Code Online (Sandbox Code Playgroud)

另见这个简短的演示.