Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #11 (permalink)  
Старый 28.09.2021, 11:28
Аватар для Vlasenko Fedor
Профессор
Отправить личное сообщение для Vlasenko Fedor Посмотреть профиль Найти все сообщения от Vlasenko Fedor
 
Регистрация: 13.03.2013
Сообщений: 1,572

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

пример с рекурсией
Ответить с цитированием
  #12 (permalink)  
Старый 28.09.2021, 11:46
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,704

Ну если воспользоваться идеями 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)
Ответить с цитированием
  #13 (permalink)  
Старый 28.09.2021, 11:55
Аватар для Vlasenko Fedor
Профессор
Отправить личное сообщение для Vlasenko Fedor Посмотреть профиль Найти все сообщения от Vlasenko Fedor
 
Регистрация: 13.03.2013
Сообщений: 1,572

Тогда так на колбеках
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)
Ответить с цитированием
  #14 (permalink)  
Старый 28.09.2021, 12:07
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,123

Сообщение от Aetae
Мой велосипед запускает все функции сразу, но выводит по мере исполнения и по порядку.)
Конечно это более навороченный вариант.
Ответить с цитированием
  #15 (permalink)  
Старый 28.09.2021, 12:08
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,123

Сообщение от voraa
Я считаю предыдущие решения некорректными, т.к. при вызове функций используется другой callback. Не сам runCallback
Так в задании как сказано
Сообщение от Himmelin
При этом использовать можно все, даже дописывать runCallback, но сами функции менять нельзя.
Т.ч. ничего в условии задачи не нарушено.
Ответить с цитированием
  #16 (permalink)  
Старый 28.09.2021, 13:06
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,492

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

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

Последний раз редактировалось Aetae, 28.09.2021 в 13:15.
Ответить с цитированием
  #17 (permalink)  
Старый 28.09.2021, 13:14
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 1,005

Сообщение от Aetae
Жаль в js нельзя как в жабе сделать так: args.map(Promise::new)
некоторые конструкторы умеют без new (например, Object, Function, RegExp), но промис почему-то нет.
Ответить с цитированием
  #18 (permalink)  
Старый 28.09.2021, 13:23
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 1,005

тот же вариант без асинк/авайт:
function stream(log, ...args) {
    args.reduce((acc, func) => {
        const prom = new Promise(func);
        return acc.then(() => prom).then(log);
    }, Promise.resolve());
}
Ответить с цитированием
  #19 (permalink)  
Старый 28.09.2021, 13:33
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,492

Alexandroppolus, да обычный расколабас. Те же классы которые через class не могут работать без new по спеке.
Всегда можно сделать хрень типа:
window.Promise = new Proxy(Promise, {
  apply (target, _, args) {
    return new target(...args);
  }
});
но как-то оно...
__________________
29375, 35
Ответить с цитированием
  #20 (permalink)  
Старый 28.09.2021, 13:36
Аватар для Vlasenko Fedor
Профессор
Отправить личное сообщение для Vlasenko Fedor Посмотреть профиль Найти все сообщения от Vlasenko Fedor
 
Регистрация: 13.03.2013
Сообщений: 1,572

Пошла битва за буковки
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)))
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как создать event, эмулирующий enter Artanis Events/DOM/Window 7 16.07.2019 06:40
Добавление/Перенос Event в Event FullCalendar CI_NAU Events/DOM/Window 0 08.02.2019 16:32
Игра-квест на JS, помогите разобраться в структуре m_lulu Общие вопросы Javascript 1 29.03.2018 14:02
Как отработает Event loop в этой ситуации? xfg Events/DOM/Window 20 23.09.2016 16:25
event + setTimeout fsingle Events/DOM/Window 2 02.05.2012 09:07