Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 04.11.2018, 20:49
Новичок на форуме
Отправить личное сообщение для alexwhite Посмотреть профиль Найти все сообщения от alexwhite
 
Регистрация: 15.05.2018
Сообщений: 5

Порядок выполнения 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? Буду благодарен за помощь
Ответить с цитированием
  #2 (permalink)  
Старый 04.11.2018, 22:35
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,492

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

Последний раз редактировалось Aetae, 04.11.2018 в 22:42.
Ответить с цитированием
  #3 (permalink)  
Старый 05.11.2018, 00:20
Аватар для Malleys
Профессор
Отправить личное сообщение для Malleys Посмотреть профиль Найти все сообщения от Malleys
 
Регистрация: 20.12.2009
Сообщений: 1,714

У вас и не написано, что надо ждать. Хотя 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 не выскочил?

Последний раз редактировалось Malleys, 05.11.2018 в 00:25. Причина: Добавил слово "может"
Ответить с цитированием
  #4 (permalink)  
Старый 05.11.2018, 00:34
Аватар для j0hnik
Профессор
Отправить личное сообщение для j0hnik Посмотреть профиль Найти все сообщения от j0hnik
 
Регистрация: 01.12.2016
Сообщений: 3,650

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

var x = new Promise((res)=>{
	setTimeout(()=>{
		console.log(1);
		res();
	},1000);
});
		
x.then(() => console.log(2));
Ответить с цитированием
  #5 (permalink)  
Старый 05.11.2018, 08:23
Новичок на форуме
Отправить личное сообщение для alexwhite Посмотреть профиль Найти все сообщения от alexwhite
 
Регистрация: 15.05.2018
Сообщений: 5

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



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как задать порядок выполнения событий (анимаций) RedPython jQuery 8 10.09.2018 19:46
Порядок выполнения функций с Promise и без. Даниленко Денис Общие вопросы Javascript 0 29.04.2017 12:33
Задать порядок выполнения промисов Spirtikys Общие вопросы Javascript 6 28.08.2016 21:23
Порядок выполнения анимации Tohin jQuery 3 03.07.2009 11:52
Порядок выполнения команд shooretz jQuery 2 23.06.2009 18:13