65 lines
1.6 KiB
JavaScript
Executable File
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);
|
|
}
|
|
})();
|
|
})();
|
|
});
|
|
|
|
},
|
|
};
|