Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Переменные предыдущего промиса. (https://javascript.ru/forum/misc/77270-peremennye-predydushhego-promisa.html)

winch 12.04.2019 12:18

Переменные предыдущего промиса.
 
приветствую уважаемых коллег!

Учусь работать с промисами. Есть примерно такой код:

doRequest(param1)
.then(data1 =>{
	return doRequest(param2);
} )
.then(data2 => {
	result = data1 + data2;
})


Во втором блоке then нужны результаты обеих запросов (data1 и data2), однако data1 там не доступна.
Как прокинуть во второй блок данные полученные в первом? или как по другому правильно решить эту проблему.

SuperZen 12.04.2019 13:11

https://stackoverflow.com/questions/...n-a-then-chain

winch 12.04.2019 13:38

Там приводится решение через Promise.all(...) т.е. оба запроса отправляются параллельно.
А если второй запрос необходимо выполнить после первого (т.к. для второго нужны параметры, возвращаемые первым). Тогда как?

winch 12.04.2019 13:46

Конечно, можно ещё через await или калбеками, но мне хотелось узнать есть ли решение именно по классической схеме через promis.

destus 12.04.2019 14:57

<script>
function doRequest() {
    return Promise.resolve('data2')
}

Promise.resolve('data1')
    .then(data1 => {
        return doRequest().then(data2 => [data1, data2])
    })
    .then(([data1, data2]) => console.log(data1, data2));
</script>

SuperZen 12.04.2019 15:00

там есть пример, что результат первого промиса сохраняется в переменной объявленной выше... думаю чисто на промисах, без доп переменных не получится...

или ждем других читателей...

Alexandroppolus 12.04.2019 15:12

Цитата:

Сообщение от winch
Там приводится решение через Promise.all(...) т.е. оба запроса отправляются параллельно.

Там решение через Promise.all выполняется последовательно.

winch 12.04.2019 15:48

кажется destus классное решение показал, чуть позже проверю как будет работать.

SuperZen 12.04.2019 16:00

пример из первого поста, и в пример destus'a... это разные примеры %)

winch 12.04.2019 16:12

я так понял, что идея в том, что вместо:
return doRequest(param2);

из первого примера, надо написать:
return doRequest(param2).then(data2 => [data1, data2]);

В этом случае во второй then должны вернутся все нужные данные.


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