Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Задача на Event Loop (https://javascript.ru/forum/misc/83137-zadacha-na-event-loop.html)

Vlasenko Fedor 28.09.2021 11:28

(function test(queue) {
    const fn = queue.shift()
    fn(s => {
        runCallback(s)
        if (queue.length) test(queue)
    })
})([one, two, three])

пример с рекурсией :)

voraa 28.09.2021 11:46

Ну если воспользоваться идеями Aetae и Alexandroppolus и попытаться объединить их, то получается такой вариант
function one(callback) {
    setTimeout( function() {
        callback("First");
    }, Math.random() * 1000);
}
 
function two(callback) {
    setTimeout( function() {
        callback("Second");
    }, Math.random() * 500);
}
 
function three(callback) {
    setTimeout( function() {
        callback("Third");
    }, Math.random() * 100);
}
 
function runCallback(s) {
    console.log(s);
}

async function stream(log, ...args) {
    const ap = args.map (func => new Promise(func))
    for (let i = 0; i < args.length; i++) {
        log(await ap[i])       
    }
}
 
stream(runCallback, one, two, three)

Vlasenko Fedor 28.09.2021 11:55

Тогда так на колбеках :)
function one(callback) {
    setTimeout( function() {
        callback("First");
    }, Math.random() * 1000);
}
 
function two(callback) {
    setTimeout( function() {
        callback("Second");
    }, Math.random() * 500);
}
 
function three(callback) {
    setTimeout( function() {
        callback("Third");
    }, Math.random() * 100);
}
 
function runCallback(s) {
    console.log(s);
}

const stream = (log, ...queue) => queue.shift()(s => (log(s), queue.length && stream(log, ...queue)))
stream(runCallback, one, two, three)

ksa 28.09.2021 12:07

Цитата:

Сообщение от Aetae
Мой велосипед запускает все функции сразу, но выводит по мере исполнения и по порядку.)

Конечно это более навороченный вариант.

ksa 28.09.2021 12:08

Цитата:

Сообщение от voraa
Я считаю предыдущие решения некорректными, т.к. при вызове функций используется другой callback. Не сам runCallback

Так в задании как сказано
Цитата:

Сообщение от Himmelin
При этом использовать можно все, даже дописывать runCallback, но сами функции менять нельзя.

Т.ч. ничего в условии задачи не нарушено. :no:

Aetae 28.09.2021 13:06

voraa, во, вот это мило.)
Ток можно вот так вот модняво записать, чтоб ваще:
async function stream(log, ...args) {
  for await(let result of args.map(func => new Promise(func))) {
    log(result)       
  }
}

Жаль в js нельзя как в жабе сделать так: args.map(Promise::new), тогдаб вообще идеально было.)

Alexandroppolus 28.09.2021 13:14

Цитата:

Сообщение от Aetae
Жаль в js нельзя как в жабе сделать так: args.map(Promise::new)

некоторые конструкторы умеют без new (например, Object, Function, RegExp), но промис почему-то нет.

Alexandroppolus 28.09.2021 13:23

тот же вариант без асинк/авайт:
function stream(log, ...args) {
    args.reduce((acc, func) => {
        const prom = new Promise(func);
        return acc.then(() => prom).then(log);
    }, Promise.resolve());
}

Aetae 28.09.2021 13:33

Alexandroppolus, да обычный расколабас. Те же классы которые через class не могут работать без new по спеке.
Всегда можно сделать хрень типа:
window.Promise = new Proxy(Promise, {
  apply (target, _, args) {
    return new target(...args);
  }
});
но как-то оно...

Vlasenko Fedor 28.09.2021 13:36

Пошла битва за буковки :haha:
const stream = (log, ...args) => args.reduce((a, f) => a.then(_ => new Promise(f)).then(log), Promise.resolve());
const stream = (log, ...args) => args.shift()(s => (log(s), args.length && stream(log, ...args)))


Часовой пояс GMT +3, время: 16:15.