@timoninas1

Как сделать задачу на параллелизм в js Rubaxa?

Каким образом можно сделать данную задачу без promise?

Может кто делал, и может поделиться сылочкой на объяснения?

// Параллельные вычисления (без promise)

function parallel() {
}


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]
});
  • Вопрос задан
  • 78 просмотров
Решения вопроса 1
0xD34F
@0xD34F Куратор тега JavaScript
function parallel(tasks, onAllTasksComplete) {
  const results = [];

  function onTaskComplete(index, result) {
    results[index] = result;
    if (Object.keys(results).length === tasks.length) {
      onAllTasksComplete(results);
    }
  }

  for (let i = 0; i < tasks.length; i++) {
    const onComplete = r => onTaskComplete(i, r);
    const result = tasks[i](onComplete);
    if (result !== undefined) {
      onComplete(result);
    }
  }
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Aleksandr-JS-Developer
@Aleksandr-JS-Developer
Бери и делай
UPD:
0xD34F, спасибо, что поправили, переделал код, чтобы работало как надо:

const marks = {
  marks: 0,
  deleteMark( data ){
    marks.marks--;
    if( marks.marks <= 0 ){
      marks.callback( data );
    }
  },
  callback: null
}

const parallel = (arr, data = [], callback = null) => {
  marks.callback === null ? (marks.callback = callback) : 0;

  const foo = arr.splice( 0, 1 )[0];
  marks.marks++;

  foo( num => {
    data.push( num );
    marks.deleteMark( data );
  });

  arr.length !== 0 ? parallel(arr, data) : 0;
}


parallel([
  resolve => {
    setTimeout(function () {
      resolve(10);
    }, 1000);
  },
  resolve => {
    resolve( 5 );
  },
  resolve => {
    setTimeout(function () {
      resolve(0);
    }, 2000)
  }
], [], function (results) {
  console.log(results); // [10, 5, 0]
});


Он-же на jsfiddle

Старая версия jsfiddle (неправильная)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы