shakiriker
@shakiriker

Последний ответ от асинхронной функции?

У меня есть 3 асинхронных функций. Необходимо создать функцию, которая получит эти 3 функции и некоторый обратный вызов в аргументах и вызовет этот обратный вызов, когда завершалась последняя асинхронная функция, и отправит эту функцию, возвращающую данные в обратный вызов. Это 3 функции имеют 1 аргумент обратного вызова.

const async1 = (cb) => {
    setTimeout(() => {
        cb(1);
    }, 4000);
};
const async2 = (cb) => {
    setTimeout(() => {
        cb(13);
    }, 6000);
};
const async3 = (cb) => {
    setTimeout(() => {
        cb(5);
    }, 3000);
};
const someCallback = (val) => console.log(val);
 yourXFunction(async1, async2, async3, someCallback);
 // for this case prints 13
  • Вопрос задан
  • 128 просмотров
Решения вопроса 1
RAX7
@RAX7
function yourXFunction(...args) {
  const asyncFns = args.slice(0, -1);
  const done = args[args.length - 1];
  let count = 0;

  function closureCallback(val) {
    count++;
    if (count === asyncFns.length) {
      done(val);
    }
  }

  asyncFns.forEach(fn => fn(closureCallback));
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
TTATPuOT
@TTATPuOT
https://code.patriotovsky.ru/
Сложно вы как-то объясняете. Это вы хотите сделать?
async1(cb)
  .then(() => {
    return async2(someCallback);
  })
  .then(() => {
    return async3(someCallback);
  })
  .then(() => {
    return someCallback();
  })
Ответ написан
sergiks
@sergiks Куратор тега JavaScript
♬♬
Возможно, костыль, но можно в переменную записывать по окончании очердной асинхроты, кто она такая. Соотв. последний записавший остаётся в этой переменной, а всех их пачкой в Promise.all()

Если бы функции asyncX() возвращали промисы:
const yourXFunction = (async1, async2, async3, someCallback) => {
  let latest; // последнее значение остаётся
  Promise.all([
    async1().then(v => {latest = 1; return v;}),
    async2().then(v => {latest = 2; return v;}),
    async3().then(v => {latest = 3; return v;}),
  ]).then(results => {
    console.log("Last was async" + latest);
    someCallback(results[latest - 1]);
  });
}


Рабочий код
const yourXFunction = (async1, async2, async3, someCallback) => {
  let latest; // последнее значение остаётся
  Promise.all([
    wrap(async1).then(v => {latest = 1; return v;}),
    wrap(async2).then(v => {latest = 2; return v;}),
    wrap(async3).then(v => {latest = 3; return v;}),
  ]).then(results => {
    someCallback(results[latest - 1]);
  });
}

const wrap = (f) => new Promise((res, rej) => f(res));
    
const async1 = (cb) => {
    setTimeout(() => {
        cb(1);
    }, 4000);
};
const async2 = (cb) => {
    setTimeout(() => {
        cb(13);
    }, 6000);
};
const async3 = (cb) => {
    setTimeout(() => {
        cb(5);
    }, 3000);
};
const someCallback = (val) => console.log(val);

yourXFunction(async1, async2, async3, someCallback);
// через 6 секунд выведет "13"
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы