28.09.2021, 11:28
|
|
Профессор
|
|
Регистрация: 13.03.2013
Сообщений: 1,572
|
|
(function test(queue) {
const fn = queue.shift()
fn(s => {
runCallback(s)
if (queue.length) test(queue)
})
})([one, two, three])
пример с рекурсией
|
|
28.09.2021, 11:46
|
|
Профессор
|
|
Регистрация: 03.02.2020
Сообщений: 2,745
|
|
Ну если воспользоваться идеями 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)
|
|
28.09.2021, 11:55
|
|
Профессор
|
|
Регистрация: 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)
|
|
28.09.2021, 12:07
|
|
CacheVar
|
|
Регистрация: 19.08.2010
Сообщений: 14,215
|
|
Сообщение от Aetae
|
Мой велосипед запускает все функции сразу, но выводит по мере исполнения и по порядку.)
|
Конечно это более навороченный вариант.
|
|
28.09.2021, 12:08
|
|
CacheVar
|
|
Регистрация: 19.08.2010
Сообщений: 14,215
|
|
Сообщение от voraa
|
Я считаю предыдущие решения некорректными, т.к. при вызове функций используется другой callback. Не сам runCallback
|
Так в задании как сказано
Сообщение от Himmelin
|
При этом использовать можно все, даже дописывать runCallback, но сами функции менять нельзя.
|
Т.ч. ничего в условии задачи не нарушено.
|
|
28.09.2021, 13:06
|
|
Тлен
|
|
Регистрация: 02.01.2010
Сообщений: 6,585
|
|
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.
|
|
28.09.2021, 13:14
|
|
Профессор
|
|
Регистрация: 25.10.2016
Сообщений: 1,012
|
|
Сообщение от Aetae
|
Жаль в js нельзя как в жабе сделать так: args.map(Promise::new)
|
некоторые конструкторы умеют без new (например, Object, Function, RegExp), но промис почему-то нет.
|
|
28.09.2021, 13:23
|
|
Профессор
|
|
Регистрация: 25.10.2016
Сообщений: 1,012
|
|
тот же вариант без асинк/авайт:
function stream(log, ...args) {
args.reduce((acc, func) => {
const prom = new Promise(func);
return acc.then(() => prom).then(log);
}, Promise.resolve());
}
|
|
28.09.2021, 13:33
|
|
Тлен
|
|
Регистрация: 02.01.2010
Сообщений: 6,585
|
|
Alexandroppolus, да обычный расколабас. Те же классы которые через class не могут работать без new по спеке.
Всегда можно сделать хрень типа:
window.Promise = new Proxy(Promise, {
apply (target, _, args) {
return new target(...args);
}
});
но как-то оно...
__________________
29375, 35
|
|
28.09.2021, 13:36
|
|
Профессор
|
|
Регистрация: 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)))
|
|
|
|