Skip to content

Context API Contexts RU

dev2alert edited this page Jan 30, 2022 · 7 revisions

Главная Context API ▸ Контексты

Определение

Контекст - это класс, экземпляр которого создаётся при инициализации чего-либо (например: при подключении игрока).

Дочерние контексты

Контекст может состоять из дочерних контекстов:

// index.ts
import {GameMode} from "@sa-mp/core";
import {Context} from "@sa-mp/decorators";
import {A} from "./a.gtx";
import {B} from "./b.gtx";

@Context([A, B])
export class Mode extends GameMode.Context {
    public onInit(): void {
        console.log("[Mode] Init!");
    }
}

// a.gtx.ts
import {GameMode} from "@sa-mp/core";
import {Context} from "@sa-mp/decorators";

@Context()
export class A extends GameMode.Context {
    public onInit(): void {
        console.log("[Mode][A] Init!");
    }
}

// b.gtx.ts
import {GameMode} from "@sa-mp/core";
import {Context} from "@sa-mp/decorators";

@Context()
export class B extends GameMode.Context {
    public onInit(): void {
        console.log("[Mode][B] Init!");
    }
}

Вывод:

[Mode] Init!
[Mode][A] Init!
[Mode][B] Init!

Импорт контекстов

Импорт контекста - это получение экземпляра контекста.

Импорт между контекстами:

// mode.gctx.ts
import {GameMode} from "@sa-mp/core";
import {Context, Import} from "@sa-mp/decorators";
import {A} from "./a.gtx";
import {B} from "./b.gtx";

@Context([A, B])
export class Mode extends GameMode.Context {
    @Import(() => A)
    public readonly a: A;

    public onInit(): void {
        console.log("[Mode] Init!");
        console.log(`[Mode] 2 + 3 = ${this.a.plus(2, 3)};`);
    }

    public multi(a: number, b: number): number {
        return a * b;
    }
}

// a.gtx.ts
import {GameMode} from "@sa-mp/core";
import {Context, Import} from "@sa-mp/decorators";
import {B} from "./b.gtx";

@Context()
export class A extends GameMode.Context {
    @Import(() => B)
    public readonly b: B;

    public onInit(): void {
        console.log("[Mode][A] Init!");
        console.log(`[Mode][A] 12 - 7 = ${this.b.minus(12, 7)};`);
    }

    public plus(a: number, b: number): number {
        return a + b;
    }
}

// b.gtx.ts
import {GameMode} from "@sa-mp/core";
import {Context, Import} from "@sa-mp/decorators";
import {Mode} from "./mode.gctx";

@Context()
export class B extends GameMode.Context {
    @Import(() => Mode)
    public readonly mode: Mode;

    public onInit(): void {
        console.log("[Mode][B] Init!");
        console.log(`[Mode][B] 3 * 4 = ${this.mode.multi(3, 4)};`);
    }

    public minus(a: number, b: number): number {
        return a - b;
    }
}

Вывод:

[Mode] Init!
[Mode] 2 + 3 = 5;
[Mode][B] Init!
[Mode][B] 3 * 4 = 12;
[Mode][A] Init!
[Mode][A] 12 - 7 = 5;

Импорт возможен без передачи аргументов () => A:

Убедитесь, что включён флаг компиляции "emitDecoratorMetadata": true!

import {GameMode} from "@sa-mp/core";
import {Context, Import} from "@sa-mp/decorators";
import {A} from "./a.gtx";
import {B} from "./b.gtx";

@Context([A, B])
export class Mode extends GameMode.Context {
    @Import()
    public readonly a: A;

    public onInit(): void {
        console.log("[Mode] Init!");
        console.log(`[Mode] 2 + 3 = ${this.a.plus(2, 3)};`);
    }

    public multi(a: number, b: number): number {
        return a * b;
    }
}

Обработчики событий контекста

Пример:

import {GameMode} from "@sa-mp/core";
import {Context} from "@sa-mp/decorators";

@Context()
export class Mode extends GameMode.Context {
    public handleContextCreate(): void {
        super.handleContextCreate();
        console.log("handleContextCreate");
    }

    public handleContextDestroy(): void {
        super.handleContextDestroy();
        console.log("handleContextDestroy");
    }
}

Где handleContextCreate - обработчик создания контекста, handleContextDestroy - обработчик уничтожения контекста.

Замороженные контексты

Замороженный контекст - это контекст, у которого не вызываются события.

Заморозка распространяется на дочерние контексты.

Есть 2 способа заморозить контекст:

1 способ

Использовать предоставляемую функциональность:

import {GameMode} from "@sa-mp/core";
import {Context, Import} from "@sa-mp/decorators";
import {A} from "./a.gtx";
import {B} from "./b.gtx";

@Context([A, B])
export class Mode extends GameMode.Context {
    @Import()
    public readonly a: A;

    public handleContextCreate(): void {
        super.handleContextCreate();
        this.freeze();
    }

    public onInit(): void {
        console.log("[Mode] Init!");
        console.log(`[Mode] 2 + 3 = ${this.a.plus(2, 3)};`);
    }

    public multi(a: number, b: number): number {
        return a * b;
    }
}

Где freeze - это метод, который замораживает контекст.

Чтобы разморозить контекст, используйте метод unfreeze.

Вывод будет пустым.

2 способ

Переопределение метода проверяющего, замороженный ли контекст:

import {GameMode} from "@sa-mp/core";
import {Context, Import} from "@sa-mp/decorators";
import {A} from "./a.gtx";
import {B} from "./b.gtx";

@Context([A, B])
export class Mode extends GameMode.Context {
    @Import()
    public readonly a: A;

    public isFrozen(): boolean {
        return true;
    }

    public onInit(): void {
        console.log("[Mode] Init!");
        console.log(`[Mode] 2 + 3 = ${this.a.plus(2, 3)};`);
    }

    public multi(a: number, b: number): number {
        return a * b;
    }
}

Где isFrozen - это метод, проверяющий заморожен ли контекст.

Вывод будет пустым.

Чтобы проверить, заморожен ли контекст и его родители, используйте метод isFrozenStrict.

Цикл событий контекста

В контексте доступны 6 методов цикла событий setTimeout, clearTimeout, setInterval, clearInterval, setImmediate и clearImmediate.

Отличия от обычного цикла событий:

  • Не выполняется, когда контекст замороженный.
  • Очищается, когда контекст уничтожается.

Это является дополнительным функционалом для контекстов!

Пример:

import {GameMode, Rcon} from "@sa-mp/core";
import {Context} from "@sa-mp/decorators";

@Context()
export class Mode extends GameMode.Context {
    public handleContextCreate(): void {
        super.handleContextCreate();
        console.log("[Mode] handleContextCreate");
    }

    public handleContextDestroy(): void {
        console.log("[Mode] handleContextDestroy");
        super.handleContextDestroy();
    }

    public onInit(): void {
        console.log("[Mode] Init!");
        this.setInterval(() => console.log("[Mode] 1s"), 1000);
        this.setTimeout(() => Rcon.send("exit"), 3000);
    }

    public onExit(): void {
        console.log("[Mode] Exit!");
    }
}
Clone this wiki locally