/// module formsjs { export class ValidationPromiseBuilder { private failureMessages_:Array; private promise_:Promise; private promiseRejecter_:(error?:any) => void; private promiseResolver_:(value?:any) => void; private promises_:Array>; constructor(promises?:Array>) { this.promises_ = promises || []; this.failureMessages_ = []; } /** * Adds validation Promises to the watched collection. * * @param promises Set of validation promise to observe * @returns A reference to the current ValidationPromiseBuilder */ public add(promises:Array>):ValidationPromiseBuilder { promises.forEach((promise) => { this.promises_.push(promise); promise.then( () => { this.markCompleted_(promise); this.checkForCompletion_(); }, (error:any) => { this.failureMessages_.push(error); this.markCompleted_(promise); this.checkForCompletion_(); } ); }); return this; } /** * Creates a Promise to be resolved or rejected once all watched validation Promises complete. */ public build():Promise { this.promise_ = new Promise( (resolve:(value?:any) => void, reject:(error?:any) => void) => { this.promiseResolver_ = resolve; this.promiseRejecter_ = reject; }); this.checkForCompletion_(); return this.promise_; } private checkForCompletion_():void { if (this.promise_ && this.promises_.length === 0) { if (this.failureMessages_.length > 0) { this.promiseRejecter_(this.failureMessages_); } else { this.promiseResolver_(); } } } private markCompleted_(promise:Promise):void { this.promises_.splice( this.promises_.indexOf(promise), 1); } } }