async-test-util
Version:
Util-functions that are be useful in async tests
52 lines (51 loc) • 1.52 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = waitUntil;
var _wait = _interopRequireDefault(require("./wait"));
var _promisify = _interopRequireDefault(require("./promisify"));
/**
* waits until the given function returns true
* @param {function} fun
* @return {Promise}
*/
function waitUntil(fun) {
var timeout = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
var interval = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 20;
var timedOut = false;
var ok = false;
if (timeout !== 0) {
(0, _wait["default"])(timeout).then(function () {
return timedOut = true;
});
}
return new Promise(function (resolve, reject) {
/**
* @recursive
* @return {Promise<void>}
*/
function runLoopOnce() {
if (ok) {
resolve(ok);
} else if (timedOut) {
reject(new Error('AsyncTestUtil.waitUntil(): reached timeout of ' + timeout + 'ms'));
} else {
return (0, _wait["default"])(interval).then(function () {
return (0, _promisify["default"])(fun());
})
/**
* Propagate errors of the fun function
* upwards.
*/["catch"](function (err) {
return reject(err);
}).then(function (value) {
ok = value;
return runLoopOnce();
});
}
}
runLoopOnce();
});
}