Javascript-форум (https://javascript.ru/forum/)
-   Javascript под браузер (https://javascript.ru/forum/css-html/)
-   -   Порядок выполнения then в promise (https://javascript.ru/forum/css-html/75765-poryadok-vypolneniya-then-v-promise.html)

alexwhite 04.11.2018 20:49

Порядок выполнения then в promise
 
Добрый день! Проблема с пониманием promise

function func() {
        return new Promise(resolve => resolve())
    }

    func()
        .then(() => {
             setTimeout(() => console.log(1), 0)
             return func()
        })
        .then(() => console.log(2))


Если последующий then должен ждать выполнение предыдущего, почему выводит 2 потом 1? Буду благодарен за помощь

Aetae 04.11.2018 22:35

Потому что setTimeout никакого отношения к промисам не имеет и "запускает отдельный поток"(на самом деле нет, но так проще для понимания, детали подождут). Промисы вещь в себе, промис ожидает только другой промис.
Promise.resolve() //тоже самое что ваша func только встроенное
.then(() => {
  return new Promise(
    resolve => setTimeout(() => {
      console.log(1);
      resolve();          
    }, 0)
  );
})
.then(() => console.log(2))

Malleys 05.11.2018 00:20

У вас и не написано, что надо ждать. Хотя setTimeout никакого отношения к промисам не имеет, можно написать такую функцию
function delay(ms) {
	return new Promise(resolve => setTimeout(resolve, ms));
}

new Promise(resolve => {
	delay(0).then(() => console.log(1)).then(resolve);
}).then(() => console.log(2));


Цитата:

Сообщение от Aetae
"запускает отдельный поток"(на самом деле нет, ...

ОСТОРОЖНО! От данного скрипта может зависать вкладка!
setTimeout(() => alert("Я в отдельном потоке"), 0);

while(true) {}
То, что оно не запускает отдельный поток, намного легче и правильно для понимания. Если setTimeout "запускает отдельный поток", то почему alert не выскочил?

j0hnik 05.11.2018 00:34

упростил для понимания

var x = new Promise((res)=>{
	setTimeout(()=>{
		console.log(1);
		res();
	},1000);
});
		
x.then(() => console.log(2));

alexwhite 05.11.2018 08:23

Какой же бред я написал. Всем спасибо за объяснения! Теперь все понятно.


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