?/*
* Copyright © Aleksey Nemiro, 2015. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
module Nemiro {
/**
* The class allows you to perform the specified action and automatically repeated if an error occurs.
*/
export class TryAction {
/** The action to execution. */
public Action: { (): void; } = null;
/** The maximum number of attempts. Default: 10. */
public MaxAttempts: number = 10;
/**
* The duration of pauses between attempts (in seconds).
* Minus one - automatically (by default).
*/
public Pause: number = -1;
/** Attempts counter. */
private Attempts: number = 0;
constructor(action: { (): void; }) {
if (action == null) {
throw Error('Action is required.');
}
this.Action = action;
}
/** Executes the task. */
public Run(): void {
this.Attempts++;
if (this.Attempts > this.MaxAttempts) {
throw new Error('Reached the allowable limit of attempts to perform a task.');
}
// ???? ??? ?? ?????? ???????, ?????? ?????
if (this.Attempts > 1) {
var pause = 0;
if (this.Pause == -1) {
if (this.Attempts <= 5) {
pause = ((this.Attempts % 2) == 0 ? 2000 : 4000);
} else {
pause = ((this.Attempts % 2) == 0 ? 4000 : 8000);
}
} else {
pause = this.Pause * 1000;
}
console.log('Pause', pause / 1000)
window.setTimeout(this.Action, pause);
} else {
this.Action();
}
}
}
}
|