parallel.js
This commit is contained in:
parent
f21719db80
commit
9a20e41ec6
52
src/parallel.js
Normal file
52
src/parallel.js
Normal file
|
@ -0,0 +1,52 @@
|
||||||
|
// Параллельные вычисления
|
||||||
|
|
||||||
|
const WAIT_CHECK_TIME = 10;
|
||||||
|
|
||||||
|
function parallel(promises, callback) {
|
||||||
|
const result = [];
|
||||||
|
|
||||||
|
let done = 0;
|
||||||
|
const setResult = (i, res) => {
|
||||||
|
done++;
|
||||||
|
result[i] = res;
|
||||||
|
}
|
||||||
|
for (let i in promises) {
|
||||||
|
const promise = promises[i];
|
||||||
|
const res = promise((res) => setResult(i, res));
|
||||||
|
if (res) {
|
||||||
|
setResult(i, res);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// if all sync
|
||||||
|
if (done === promises.length) {
|
||||||
|
callback(result);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// if at least one is async
|
||||||
|
const waitInterval = setInterval(() => {
|
||||||
|
if (done === promises.length) {
|
||||||
|
clearInterval(waitInterval);
|
||||||
|
callback(result);
|
||||||
|
}
|
||||||
|
}, WAIT_CHECK_TIME);
|
||||||
|
}
|
||||||
|
|
||||||
|
parallel([
|
||||||
|
function (resolve) {
|
||||||
|
setTimeout(function () {
|
||||||
|
resolve(10);
|
||||||
|
}, 50);
|
||||||
|
},
|
||||||
|
function () {
|
||||||
|
return 5;
|
||||||
|
},
|
||||||
|
function (resolve) {
|
||||||
|
setTimeout(function () {
|
||||||
|
resolve(0);
|
||||||
|
}, 10)
|
||||||
|
}
|
||||||
|
], function (results) {
|
||||||
|
console.log(results); // [10, 5, 0]
|
||||||
|
});
|
Loading…
Reference in New Issue
Block a user