diff options
author | lj1412 <lji@research.att.com> | 2017-02-14 15:10:25 +0000 |
---|---|---|
committer | lj1412 <lji@research.att.com> | 2017-02-14 15:10:27 +0000 |
commit | f2ec39706a7a31017f5d219c44d54d40714d9a27 (patch) | |
tree | 0442ccf8420a388d264cca3bc4965a0c1035af0d /lib/repeat.js | |
parent | d53e0cf57fc289259b6c9de5bfad224f23cd2988 (diff) |
Init dcae.orch-dispatcher
Change-Id: I52aa696bd5d1d5ed3bc6e03a3c994dc0b3a71062
Signed-off-by: lj1412 <lji@research.att.com>
Diffstat (limited to 'lib/repeat.js')
-rw-r--r-- | lib/repeat.js | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/lib/repeat.js b/lib/repeat.js new file mode 100644 index 0000000..2ea0e14 --- /dev/null +++ b/lib/repeat.js @@ -0,0 +1,54 @@ +/* +Copyright(c) 2017 AT&T Intellectual Property. 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. +*/ + +"use strict"; + +/** + * Returns a promise for running and re-running the specified action until the result meets a specific condition + * - action is a function that returns a promise + * - predicate is a function that takes a success result from action and returns true if the action should be rerun + * - maxTries is the total number of times to try the action + * - interval is the interval, in milliseconds, between tries, as approximated by setTimeout() + */ + +exports.repeatWhile = function(action, predicate, maxTries, interval) { + return new Promise(function(resolve, reject) { + + var count = 0; + + function makeAttempt() { + action() + .then (function(res) { + if (!predicate(res)) { + // We're done + resolve(res); + } + else { + if (++count < maxTries) { + // set up next attempt + setTimeout(makeAttempt, interval); + } + else { + // we've run out of retries or it's not retryable, so reject the promise + reject({message: "maximum repetions reached: " + count }); + } + } + }); + } + + makeAttempt(); + }); +}; |