рд╣рдо рдбреЗрд╡рд▓рдкрд░реНрд╕ рдпреВрдирд┐рдЯ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рдмрд╣реБрдд рд╢реМрдХреАрди рд╣реИрдВ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рд╕реНрдкрд╖реНрдЯ рд╣реИред рдФрд░ рдЗрд╕рд▓рд┐рдП рдХрд┐ рдпреЗ рдкрд░реАрдХреНрд╖рдг рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрдкрдпреЛрдЧреА рд╣реИрдВ, рдФрд░ рджрд░реНрдж рдирд╣реАрдВ рд▓рд╛рддреЗ рд╣реИрдВ, рдЙрдирдХреА рд╕реНрдерд┐рд░рддрд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред
рд╣рдорд╛рд░реА рдХрдВрдкрдиреА рд╡рд╛рд╕рдмреА рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдврд╛рдВрдЪрд╛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рддреА рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдирд┐рд░реНрдорд┐рдд рдЙрддреНрдкрд╛рджреЛрдВ рдХреЛ рдмреЗрдЪрддреА рд╣реИ, рдЬреЛ рдХреНрд▓рд╛рдЙрдб рдФрд░ рдбреЗрд╕реНрдХрдЯреЙрдк рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╣реИрдВред рд░рд┐рд▓реАрдЬ рдЪрдХреНрд░ рдХрд╕рдХрд░ рдХреИрд▓реЗрдВрдбрд░ рд╕реЗ рдмрдВрдзрд╛ рд╣реБрдЖ рд╣реИ, рдФрд░ рдЙрддреНрдкрд╛рдж рдХреА рдЧреБрдгрд╡рддреНрддрд╛ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рд░рдВрддрд░ рдЕрдХреНрд╖рдо рдкреНрд░рдХреНрд░рд┐рдпрд╛рдПрдВ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИрдВред рд╣рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдЬреЗрдирдХреАрдВрд╕ рд╡рд┐рдзрд╛рдирд╕рднрд╛рдУрдВ рдФрд░ рдХреЗ рд▓рд┐рдП рдореЛрдЪрд╛ рдХреЗ рд╕рд╛рде рд╕рдВрдпреЛрдЬрди рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд╛рдп рдЬрд╝реЛрд░рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛрдб рдХреЗ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдпреВрдирд┐рдЯред рдФрд░ рд╣рд╛рд▓ рд╣реА рдореЗрдВ, рд╣рдореЗрдВ рдПрдХ рдРрд╕реА рд╕реНрдерд┐рддрд┐ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рд╛ рдЬрд╣рд╛рдВ рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдирд┐рдЧрд░рд╛рдиреА рдиреЗ рдпрд╣ рджрд┐рдЦрд╛рдирд╛ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛ рдХрд┐ рдЙрдирдХреЗ рдкрддрди рдХреЗ рд╕рднреА рдорд╛рдорд▓реЛрдВ рдореЗрдВ рд╕реЗ рд▓рдЧрднрдЧ рдЖрдзреЗ рдЕрд╕реНрдерд┐рд░ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкрд░реАрдХреНрд╖рдг рдХреЗ рдХрд╛рд░рдг рдереЗред рд▓рдХреНрд╖рдг рд╕рдорд╛рди рд╣реИрдВ: рд╕реЗрдЯ рд╕реЗ рдПрдХ рдЕрд▓рдЧ рдкрд░реАрдХреНрд╖рдг рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╛ рддреЛ рд╕рдордп рдирд╣реАрдВ рд╣реИ, рдпрд╛ рдЕрдкреЗрдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдЧрд▓рдд рдкрд░рд┐рдгрд╛рдо рджреЗрддрд╛ рд╣реИред рдФрд░ рдорд╛рдорд▓реЛрдВ рдХреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рд╕реЗ рд▓рдЧрднрдЧ рд╣рдореЗрд╢рд╛ рдЗрд╕ рддрдереНрдп рдХрд╛ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдкрд░реАрдХреНрд╖рдг рдЬрд┐рд╕рдореЗрдВ рд╕реЗрдЯрдЯрд╛рдЗрдордЖрдЙрдЯ рдпрд╛ рд╕реЗрдЯрдЗрдВрдЯрд░рд╡рд▓ рдлрд╝рдВрдХреНрд╢рди рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рдпрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдП рдЧрдП рдХреЛрдб рдХреНрд░реИрд╢ рдореЗрдВ рдХреЙрд▓ рд╣реЛрддреЗ рд╣реИрдВ ред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реИ, рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣рдо рдЖрдЧреЗ рдмрд╛рдд рдХрд░реЗрдВрдЧреЗред
рдРрд╕рд╛ рдХреНрдпреЛрдВ рд╣реЛрддрд╛ рд╣реИ?
рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рд╣реИ - рдХреЛрдб рдХреЗ рдЕрдВрджрд░ рдЬреЛ рдбреЗрд╡рд▓рдкрд░ рдкрд░реАрдХреНрд╖рдг рдХрд░ рд░рд╣рд╛ рд╣реИ, рдПрдХ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХреЙрд▓ рд╣реЛрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдЕрдВрдд рдореЗрдВ рдкрд░реНрдпрд╛рд╡рд░рдг рдХреА рд╕реНрдерд┐рддрд┐ рдХрд┐рд╕реА рддрд░рд╣ рдмрджрд▓рддреА рд╣реИред рдФрд░ рдкрд░реАрдХреНрд╖рдг рдпрд╣ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕реНрдерд┐рддрд┐ рдЕрдкреЗрдХреНрд╖рд┐рдд рд╣реИред рд▓реЗрдХрд┐рди рдЬрдмрд╕реЗ рдЪреВрдВрдХрд┐ рд╣рдо рдПрдХ рдЖрджрд░реНрд╢ рджреБрдирд┐рдпрд╛ рдореЗрдВ рдирд╣реАрдВ рд░рд╣рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдРрд╕рд╛ рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдХреЛрдб рдХреЗ рд▓рд┐рдП рдПрдХ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдпреБрджреНрдз рдореЗрдВ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ, рдФрд░ рдЬреЛ рдореВрд▓ рд░реВрдк рд╕реЗ рдЗрд╕ рддрд░рд╣ рдХреЗ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рдирд╣реАрдВ рдерд╛ред рдФрд░ рдбреЗрд╡рд▓рдкрд░ рдХреЛ рдпрд╣ рддрдп рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рд╡рд╣ рдРрд╕реЗ рдХреЛрдб рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХреИрд╕реЗ рдХрд░ рд╕рдХрддрд╛ рд╣реИред
рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ, рдкрд░реАрдХреНрд╖рдг рдХреЗ рддрд╣рдд рдХреЛрдб рдПрдХ рд╡рд░реНрдЧ рд╡рд┐рдзрд┐ рд╣реИ рдЬреЛ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд░реВрдк рд╕реЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдмрджрд▓рддрд╛ рд╣реИред рдФрд░ рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдирд╣реАрдВ рд▓рд┐рдЦрд╛ рд╣реИ:
export class Foo {
propToTest: boolean = false;
methodToTest(): void {
setTimeout(() => {
this.propToTest = true;
}, 100);
}
}
? , setTimeout . c , (, 101 100 ). :
it('should set propToTest to true', (done: Function) => {
const inst = new Foo();
inst.methodToTest();
setTimeout(() => {
assert.isTrue(inst.propToTest);
done();
}, 101);
});
? , , .. , callback, setTimeout, . тАФ , 2 , . , . -, . , , - , тАФ -.
setInterval.
, . , . , , .
- callback- , setTimeout/setInterval (" 1001 101, "). .
- setTimeout() (" event loop, "). .
- ( 1 2) тАФ , , .
?
, , . , , : . .
тАФ .. .
, , :
export function setProperState(inst: Foo) {
inst.propToTest = true;
}
export class Foo {
propToTest: boolean = false;
methodToTest(): void {
setTimeout(() => {
setProperState(this);
}, 100);
}
}
:
it('should set propToTest to true', () => {
const inst = new Foo();
assert.isFalse(inst.propToTest);
setProperState(inst);
assert.isTrue(inst.propToTest);
});
, setProperState methodToTest ( ). , : , . , , .
, , .
, setTimeout :
export class Foo {
propToTest: boolean = false;
constructor(readonly awaiter: Function = setTimeout) {
}
methodToTest(): void {
this.awaiter(() => {
this.propToTest = true;
}, 100);
}
}
-, :
it('should set propToTest to true', () => {
const awaiter = (callback) => callback();
const inst = new Foo(awaiter);
inst.methodToTest();
assert.isTrue(inst.propToTest);
});
, Promise.
, тАФ , . . . :
export class Foo {
propToTest: boolean = false;
methodToTest(): Promise<void> {
return new Promise((resolve) => {
setTimeout(() => {
this.propToTest = true;
resolve();
}, 100);
});
}
}
setTimeout:
it('should set propToTest to true', () => {
const inst = newFoo();
return inst.methodToTest().then(() => {
assert.isTrue(inst.propToTest);
});
});
, , , " ". setTimeout , .
export class Foo {
propToTest: boolean = false;
constructor(readonly asyncTimeout: number = 100) {
}
methodToTest(): void {
return new Promise((resolve) => {
setTimeout(() => {
this.propToTest = true;
resolve();
}, this.asyncTimeout);
});
}
}
.
fake timers.
Sinon.JS , . - ( ), setTimeout .
:
export class Foo {
propToTest: boolean = false;
methodToTest(): void {
setTimeout(() => {
this.propToTest = true;
}, 100);
}
}
fake timer, (!):
let clock;
beforeEach(() => {
clock = sinon.useFakeTimers();
});
afterEach(() => {
clock.restore();
});
it('should set propToTest to true', () => {
const inst = newFoo();
inst.methodToTest();
clock.tick(101);
assert.isTrue(inst.propToTest);
});
" " clock.restore(), .
- , . - , . , , .