Вход

Просмотр полной версии : Задать порядок выполнения промисов


Spirtikys
28.08.2016, 13:46
Добрый день.

Подскажите, как можно задать порядок при выполнении промисов.
Допустим, есть такой вот код
function generate() {
let ms = Math.round(Math.random() * 1000);

return new Promise((resolve, reject) => {
setTimeout(() => {
resolve(ms);
}, ms);
});
}

for (let i = 0; i < 3; i++) {
Promise.all([generate(), generate(), generate()])
.then(value => log(value, i));
}

Сейчас в цикле создается 3 промиса и выводятся они в порядке кто первый отработал. А как задать им последовательность?

Spirtikys
28.08.2016, 13:51
И еще, глупый вопрос, но все таки.

function generate(ms) {
let number;

setTimeout( () => {
number = Math.round( Math.random() * 10 );
}, ms);

return number;
}

Как присвоить number асинхронно значение и вернуть его при выполнении функции generate ?

destus
28.08.2016, 14:02
cейчас в цикле создается 3 промиса и выводятся они в порядке кто первый отработал. А как задать им последовательность?

function generate() {
let ms = Math.round(Math.random() * 1000);

return new Promise((resolve, reject) => {
setTimeout(() => {
resolve(ms);
}, ms);
});
}
let chain = generate();

for (let i = 0; i < 3; i++) {
chain = chain.then(value => {
console.log(value, i);
return generate()
});
}

destus
28.08.2016, 14:06
Как присвоить number асинхронно значение и вернуть его при выполнении функции generate ?


function generate(ms) {
return new Promise((resolve, reject) => {
let number;

setTimeout( () => {
number = Math.round( Math.random() * 10 );
resolve(number);
}, ms);

})
}

generate(300).then(console.log);

Spirtikys
28.08.2016, 15:38
function generate(ms) {
return new Promise((resolve, reject) => {
let number;

setTimeout( () => {
number = Math.round( Math.random() * 10 );
resolve(number);
}, ms);

})
}

generate(300).then(console.log);

Спасибо большое. Совсем забыл про чейнинг в первой части =/ Хотя не совсем то, что я хотел, так как генерировать хочу больше одного значения на выходе.
Во второй части, хотел бы уточнить, через промисы проблем это не вызвало, а как сделать без него и не вынося наверх интервал? Возможно ли это? Сугубо в своих интересах так сказать, чтобы лучше понять язык.

destus
28.08.2016, 16:27
Spirtikys,
Pub/sub. Но зачем, если есть промисы, бабель и полифилл?

Spirtikys
28.08.2016, 21:23
Spirtikys,
Pub/sub. Но зачем, если есть промисы, бабель и полифилл?
Как я писал выше, это "научный" интерес) В целом да, вы правы, велосипед не к месту придумывать, но, интересно.
Можете рассказать по подробнее о pub\sub ?