@Mr-Governor
Губернирую

Почему не работает асинхроннность?

Есть класс тест:
class Test {
	caller() {
		this.asyncMethod();
		console.log(`hello from caller`);
	}

	async asyncMethod() {
		console.log(`hello from asyncMethod`);
	}
}

в классе есть метод caller, который вызывает асинхронный метод asyncMethod.

Для вызова я создаю экземпляр, и вызываю caller. Так: new Test().caller();
Я предполагал что функция asyncMethod будет отложена на потом, но она срабатывает сразу и только потом дорабатывает метод caller.
Результат: 62a879d3e82b4948511453.png
Заметьте, я не пишу await
Так же пробовал оборачивать в Promise, но результат тот же.

Что я делаю не так?
  • Вопрос задан
  • 136 просмотров
Пригласить эксперта
Ответы на вопрос 3
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Функция срабатывает не "потом". Она срабатывает сразу же, но, поскольку в ней самой ничего асинхронного нет, она просто возвращает уже зарезолвленный Promise.
Реально асинхронно, в отдельных служебных потоках, работают только некоторые встроенные функции JS - XMLHttpRequest, fetch, setTimeout, setInterval.
Ответ написан
Комментировать
@kfedechkin
Когда ты добавляешь async ты говоришь что твой метод будет возвращать Promise
class Test {
  caller() {
    console.log(this.asyncMethod());
    console.log(`hello from caller`);
  }

  async asyncMethod() {
  }
}


Что бы сделать console.log() в asyncMethod, нужно либо обернуть его в setTimeout, либо вызывать после какого либо запроса

async asyncMethod() {
    return await fetch(...).then(() => console.log(`hello from asyncMethod`))
  }

asyncMethod() {
     setTimeout(() => {
        console.log(`hello from asyncMethod`)
    })
  }
Ответ написан
Комментировать
@GrayHorse
async asyncMethod() {
  // следующее добавит в очередь микро-тасков:
  await null; // или
  await Promise.resolve();
  // а это добавит в очередь тасков:
  await new Promise(resolve => setTimeout(resolve)); 
  // лучше используй setImmediate, он многократно быстрее отработает (без задержки в 4 мс)

  console.log("hello from asyncMethod");
}

Код "асинхронной" (с модификатором async) функции или коллбека конструтора Promise выполняется синхронно до первого await.

Если не используешь await, не используй async.
Иначе просто бесполезный промис создаешь.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы