Merge pull request #1877 from NativeScript/hdeshev/zone-aware

Zone-aware versions of certain APIs: setTimeout/setInterval mostly.
This commit is contained in:
Hristo Deshev
2016-04-01 14:46:43 +03:00
4 changed files with 21 additions and 7 deletions

4
declarations.d.ts vendored
View File

@@ -146,6 +146,10 @@ declare function setInterval(callback: Function, milliseconds?: number): number;
*/ */
declare function clearInterval(id: number): void; declare function clearInterval(id: number): void;
//@private
declare function zonedCallback(callback: Function): Function;
//@endprivate
declare class WeakRef<T> { declare class WeakRef<T> {
constructor(obj: T); constructor(obj: T);
get(): T; get(): T;

View File

@@ -29,6 +29,14 @@ global.loadModule = function(name: string): any {
} }
} }
global.zonedCallback = function(callback: Function): Function {
if (global.zone) {
return global.zone.bind(callback);
} else {
return callback;
}
}
global.registerModule("timer", () => require("timer")); global.registerModule("timer", () => require("timer"));
global.registerModule("ui/dialogs", () => require("ui/dialogs")); global.registerModule("ui/dialogs", () => require("ui/dialogs"));
global.registerModule("xhr", () => require("xhr")); global.registerModule("xhr", () => require("xhr"));

View File

@@ -15,11 +15,12 @@ function createHandlerAndGetId(): number {
} }
export function setTimeout(callback: Function, milliseconds = 0): number { export function setTimeout(callback: Function, milliseconds = 0): number {
var id = createHandlerAndGetId(); const id = createHandlerAndGetId();
const zoneBound = zonedCallback(callback);
var runnable = new java.lang.Runnable({ var runnable = new java.lang.Runnable({
run: () => { run: () => {
callback(); zoneBound();
if (timeoutCallbacks[id]) { if (timeoutCallbacks[id]) {
delete timeoutCallbacks[id]; delete timeoutCallbacks[id];
@@ -44,12 +45,13 @@ export function clearTimeout(id: number): void {
} }
export function setInterval(callback: Function, milliseconds = 0): number { export function setInterval(callback: Function, milliseconds = 0): number {
var id = createHandlerAndGetId(); const id = createHandlerAndGetId();
var handler = timeoutHandler; const handler = timeoutHandler;
const zoneBound = zonedCallback(callback);
var runnable = new java.lang.Runnable({ var runnable = new java.lang.Runnable({
run: () => { run: () => {
callback(); zoneBound();
if (timeoutCallbacks[id]) { if (timeoutCallbacks[id]) {
handler.postDelayed(runnable, long(milliseconds)); handler.postDelayed(runnable, long(milliseconds));
} }

View File

@@ -40,7 +40,7 @@ function createTimerAndGetId(callback: Function, milliseconds: number, shouldRep
} }
export function setTimeout(callback: Function, milliseconds = 0): number { export function setTimeout(callback: Function, milliseconds = 0): number {
return createTimerAndGetId(callback, milliseconds, false); return createTimerAndGetId(zonedCallback(callback), milliseconds, false);
} }
export function clearTimeout(id: number): void { export function clearTimeout(id: number): void {
@@ -51,7 +51,7 @@ export function clearTimeout(id: number): void {
} }
export function setInterval(callback: Function, milliseconds = 0): number { export function setInterval(callback: Function, milliseconds = 0): number {
return createTimerAndGetId(callback, milliseconds, true); return createTimerAndGetId(zonedCallback(callback), milliseconds, true);
} }
export var clearInterval = clearTimeout; export var clearInterval = clearTimeout;