stock-indicators/lib/mixin/handle-generator.js
2025-03-31 11:20:04 +02:00

65 lines
1.6 KiB
JavaScript
Executable File

'use strict';
import convertHrtime from 'convert-hrtime';
import TypeUtil from '../utils/type.js';
export default {
_handleGenerator(gen) {
if (!this._options.lazyEvaluation) return gen.next().value;
return new Promise((resolve, reject) => {
let results = [];
let maxTickDuration = this._options.maxTickDuration || 10;
(function handler() {
let startHRTime = process.hrtime();
let obj = gen.next();
let nextCall = false;
while (!obj.done) {
results.push(obj.value);
let { milliseconds } = convertHrtime(process.hrtime(startHRTime));
if (milliseconds < maxTickDuration) {
obj = gen.next();
} else {
nextCall = true;
break;
}
}
(nextCall) ? setImmediate(() => handler()) : resolve(results);
})();
});
},
_handleAsyncGenerator(gen) {
return new Promise((resolve, reject) => {
let results = [];
let maxTickDuration = this._options.maxTickDuration || 0.5;
(function handler() {
let startHRTime = process.hrtime();
(async function loop() {
try {
let obj = await gen.next();
if (!obj.done) {
results.push(obj.value);
let { milliseconds } = convertHrtime(process.hrtime(startHRTime));
if (milliseconds < maxTickDuration) loop();
else setImmediate(() => handler());
}
else {
if (!TypeUtil.isUndefined(obj.value)) {
results.push(obj.value);
}
resolve(results);
}
}
catch (err) {
reject(err);
}
})();
})();
});
},
};