thank
function getRandomMs(minS, maxS) {
// синхронная функция, возвращающая целое число
// в диапазоне [minS, maxS]
return Math.floor(Math.random() * (maxS - minS + 1)) + minS;
}
function getRandomNumber(minN, maxN) {
// синхронная функция, делающая тоже что getRandomMs
// и отличающаяся только своим именем и именем переменных
return Math.floor(Math.random() * (maxN - minN + 1)) + minN;
}
function getRandom() {
// функция возвращающая промис,
// который через случайное время вернет случайное число
// создаем и сразу возвращаем промис
return new Promise(
// передаем в конструктор промиса
// анонимную функцию.
// конструктор промиса, вызовет эту функцию
// и передста ей 2 аргумента(тоже функции).
// 1й аргумент - каллбак который следует вызвать
// в случае успеха, 2й в случае ошибки
// т.к. в это задаче ошибка не предполагается,
// нам нужен только один, 1й аргумент
resolve =>
// в теле функции мы вызываем setTimeout,
// передавая ему 1м аргументом анонимную фукнцию,
// в теле которой вызов resolve с параметром
// getRandomNumber(1, 10), то есть со случайным числом.
// 2м параметром, идет случайное число секунд
setTimeout(
() => resolve(getRandomNumber(1, 10)),
getRandomMs(100, 3000)
)
);
}
function first(arr) {
// возвращаем промис
return new Promise(resolve => {
// перебираем массив,
// передав в forEach анонимную функцию,
// которая будет последовательно вызываться
// для каждого элемента массива
arr.forEach(
// передаем фунцию с модификатором async,
// это позволит использовать await в теле функции
// первый аргумент функции - элемент массива,
// второй - индекс,
// третий(ненужен тут, но вообще) - сам массив
async (c, i) =>
// в теле функции вызываем resolve.
// resolve, не вызавется пока,
// не будут готовы все аргументы.
// то есть, resolve будет ждать await c,
// после выполнится
resolve(
// возвращаем мы
// result(собсвтенно случайное число)
// promise - элемент массива, то есть результат getRandom
// index - т.к. в задаче стояло понять, какая функция в
// массиве сработала первой, по index мы
// сможем ее найти(или по promise)
{
result: await c,
promise: c,
index: i,
})
// понятно, что через какое то время вызавуться все элементы,
// но, промис возвращает только первый результат
);
})
}
function first2(arr) {
// для лучшего, понимания что делает await,
// можно передлать фунцию в более привычный вид
return new Promise(resolve => {
// перебираем массив,
// передав в forEach анонимную функцию,
// которая будет последовательно вызываться
// для каждого элемента массива
arr.forEach(
// передаем фунцию с модификатором async,
// это позволит использовать await в теле функции
// первый аргумент функции - элемент массива,
// второй - индекс,
// третий(ненужен тут, но вообще) - сам массив
async (c, i) =>
// вызываем then, в который передаем
// анонимную функию, которая вызовается,
// когда вызовут данный промис(c)
c.then(result => {
// в теле фунции, вызываем resolve
resolve({
result,
promise: c,
index: i,
})
})
);
})
}
first([getRandom(), getRandom(), getRandom()]).then(console.log);