Предположим, что когда я запускаю when (ForexateFunction, handlerFunction), эта функция предиката уже будет возвращать значение true.В этом случае handlerFunction запускается немедленно, до того, как возвращается.
Есть ли способ узнать это, проверив результат, когда или что-то еще?Или мне нужно сначала самому вызывать предикатную функцию ()?
Причина, по которой я спрашиваю, состоит в том, что я настроил немного конечного автомата, где переходы настраиваются с использованием когда.При переходе в новое состояние я не хочу запускать старые переходы, поэтому они понятны.Проблема в том, что если эти переходы запускаются сразу, как я их настраиваю, они очищаются, когда я заканчиваю настройку состояния.
Я создал этот надуманный пример, второй тест завершается неудачно с предупреждением.Кажется, что такое естественное желание хотеть сделать, я подумал, если бы кто-то с большим опытом работы с mobx понял, как правильно настроить такой конечный автомат.
expect(received).toBe(expected) // Object.is equality
Expected: "AB"
Received: "A"
import { observable, when } from "mobx";
class Observed {
@observable
A: boolean = false;
@observable
B: boolean = false;
}
class Observer {
@observable
state: string = "0";
constructor(private observed: Observed) {}
disposer: Function = () => undefined;
setDisposer = (next: Function) => {
this.disposer();
this.disposer = next;
};
run = () => {
this.setDisposer(
when(
() => this.observed.A,
() => {
this.state = "A";
this.setDisposer(
when(
() => this.observed.B,
() => {
this.state = "AB";
}
)
);
}
)
);
};
}
describe("Observer", () => {
let states: Observed;
let observer: Observer;
beforeEach(() => (states = new Observed()));
beforeEach(() => (observer = new Observer(states)));
it("waits for A then B to go into state AB", () => {
observer.run();
states.A = true;
expect(observer.state).toBe("A");
states.B = true;
expect(observer.state).toBe("AB");
});
it("waits for A then B to go into state AB, but with B already set", () => {
states.A = true;
observer.run();
states.B = true;
expect(observer.state).toBe("AB");
});
});