Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 02.04.2020, 07:36
Кандидат Javascript-наук
Отправить личное сообщение для dpts Посмотреть профиль Найти все сообщения от dpts
 
Регистрация: 12.05.2015
Сообщений: 111

async/await как получить вернуть значение из функции
Доброго дня.
Может кто-нибудь внятно объяснить следующее
В учебнике https://learn.javascript.ru/async-await
Есть такой пример:
async function f() {

  let promise = new Promise((resolve, reject) => {
    setTimeout(() => resolve("готово!"), 1000)
  });

  let result = await promise; // будет ждать, пока промис не выполнится (*)

  alert(result); // "готово!"
}

f();


Все отлично, все работает. alert с текстом Готово выводится.
Если вот этот место
alert(result); // "готово!"
}

f();

переписать, как
return result;
}
alert(f());

Получаем ObjectPromice.

И ни один пример на странице внятно не объясняет как из функции вернуть "готово!".

Вот и вопрос. как в alert(f()) "получить" - "готово!"?
Ответить с цитированием
  #2 (permalink)  
Старый 02.04.2020, 08:00
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,720

async функция всегда возвращает промис, разрешенный с тем значением, которое было указано в return.

return value в async функции эквивалентно return Promise.resolve(value), если value не является Promise. А если value - Promise, то оно и возвращается.

Что бы достать значение из возвращенного Promise - используется оператор await

async function f () {return 42}

let a = f() // a = Promise.resolve(42)
let b = await f() // b = 42

Поэтому переписываем alert (await f())
Ответить с цитированием
  #3 (permalink)  
Старый 02.04.2020, 08:39
Кандидат Javascript-наук
Отправить личное сообщение для dpts Посмотреть профиль Найти все сообщения от dpts
 
Регистрация: 12.05.2015
Сообщений: 111

Сообщение от voraa Посмотреть сообщение
...
Поэтому переписываем alert (await f())
alert (await f()) говорит: "Uncaught SyntaxError: missing ) after argument list"
Ответить с цитированием
  #4 (permalink)  
Старый 02.04.2020, 09:03
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,720

Есть тут особенность. Оператор await можно использовать только внутри асинхронных функций.
Поэтому надо обернуть код в асинхронную функцию, а потом вызывать ее

async function main () {
	async function f() {

	  let promise = new Promise((resolve, reject) => {
		setTimeout(() => resolve("готово!"), 1000)
	  });

	 return promise; // будет ждать, пока промис не выполнится (*)

	  
	}

	alert( await f());

}

main()


Другой вариант - просто использовать then

async function f() {

	  let promise = new Promise((resolve, reject) => {
		setTimeout(() => resolve("готово!"), 1000)
	  });

	 return promise; // будет ждать, пока промис не выполнится (*)

	  
	}

	f().then (res => alert(res))

Последний раз редактировалось voraa, 02.04.2020 в 09:07.
Ответить с цитированием
  #5 (permalink)  
Старый 02.04.2020, 09:22
Кандидат Javascript-наук
Отправить личное сообщение для dpts Посмотреть профиль Найти все сообщения от dpts
 
Регистрация: 12.05.2015
Сообщений: 111

Сообщение от voraa Посмотреть сообщение
Есть тут особенность. Оператор await можно использовать только внутри асинхронных функций.
Поэтому надо обернуть код в асинхронную функцию, а потом вызывать ее

async function main () {
	async function f() {

	  let promise = new Promise((resolve, reject) => {
		setTimeout(() => resolve("готово!"), 1000)
	  });

	 return promise; // будет ждать, пока промис не выполнится (*)

	  
	}

	alert( await f());

}

main()


Другой вариант - просто использовать then

async function f() {

	  let promise = new Promise((resolve, reject) => {
		setTimeout(() => resolve("готово!"), 1000)
	  });

	 return promise; // будет ждать, пока промис не выполнится (*)

	  
	}

	f().then (res => alert(res))
Я, конечно сам виноват. Не совсем корректно задал вопрос.
По большому-то счету нет задачи вывести алертом "готово", задача var i = f(), с тем, чтобы в i оказалось готово.
Ответить с цитированием
  #6 (permalink)  
Старый 02.04.2020, 09:31
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,720

Сообщение от dpts Посмотреть сообщение
Я, конечно сам виноват. Не совсем корректно задал вопрос.
По большому-то счету нет задачи вывести алертом "готово", задача var i = f(), с тем, чтобы в i оказалось готово.
Если этот самый var i находится в какой то функции, то придется делать ее асинхронной и писать

var i = await f();

Иначе

var i;
f().then(res => i = res);

В Javascript нет способа заставить код просто ждать, когда что то произойдет. Есть только возможность, сказать; "Когда произойдет, сделай то то."
Но код при этом будет выполняться дальше
Ответить с цитированием
  #7 (permalink)  
Старый 02.04.2020, 09:54
Кандидат Javascript-наук
Отправить личное сообщение для dpts Посмотреть профиль Найти все сообщения от dpts
 
Регистрация: 12.05.2015
Сообщений: 111

Сообщение от voraa Посмотреть сообщение
...
var i;
f().then(res => i = res);

В Javascript нет способа заставить код просто ждать, когда что то произойдет. Есть только возможность, сказать; "Когда произойдет, сделай то то."
Но код при этом будет выполняться дальше
Благодарю. Теперь более-менее понятно.
Ответить с цитированием
  #8 (permalink)  
Старый 02.04.2020, 09:56
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,720

Сообщение от voraa Посмотреть сообщение
Если этот самый var i находится в какой то функции, то придется делать ее асинхронной и писать

var i = await f();

Иначе

var i;
f().then(res => i = res);
Я не совсем корректно описал
Допустим есть
async function f () {....return val}

async function g() {

  var i = await f()
// какие то другие операторы
  var j = 3*i  // j зависит от i
// еще операторы

}

Тогда это будет эквивалентно (Интерпретатор буквально преобразует код)
async function g() {
  var i; 
  f().then ( res => {
     i = res;
    // какие то другие операторы
     var j = 3*i  // j зависит от i
    // еще операторы
 })
}
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как получить значение из сторонней функции? Poveritov Общие вопросы Javascript 0 14.09.2016 13:51
Видимость переменной при асинхронном запросе. Как передать и получить значение? Stroganov Ilya Общие вопросы Javascript 10 17.10.2014 17:33
Как вернуть результат из ajax внутри функции? Rooner AJAX и COMET 4 29.03.2013 19:15
Как получить значение $(document).scrollTop() при загрузке страницы в Chrome ilya_ jQuery 7 24.01.2013 15:04
Как из javascript получить значение box-shadow? PAMAC Общие вопросы Javascript 11 10.06.2012 18:48