-1

Всем спасибо, ответ на вопрос чуть ниже, вероятно это сэкономит время.

Никак. Вообще никак. Нет. Нельзя синхронно дождаться асинхронного вызова. Точно нельзя. И даже так нельзя.

Из асинхронной функции вернется промис! Объект можно разобрать в пределах async функции.


Подскажите возможно ли из async вернуть объект в переменную а не промис.

Await работает в пределах async syntax, если помещать const json = await getData(url); в async логично что опять будет возвращен промис.

var url = 'https://jsonplaceholder.typicode.com/posts';

const getData = async (url) => {

const response = await fetch(url);
const jsonObj = await response.json();

return jsonObj;

}

const json = getData(url); alert(getData(url));

  • 1
    Никак. Вообще никак. Нет. Нельзя синхронно дождаться асинхронного вызова. Точно нельзя. И даже так нельзя. – Alexey Ten Jul 19 '22 at 12:34
  • @AlexeyTen ну почему же никак вообще никак?) Может быть у нас разночтения, но.....вот у меня есть класс, в котором есть свойство data, в одном методе я запрашиваю данные и складирую результат в это свойство, а потом, к примеру при клике на кнопку какую-либо, я обрабатываю данные в другом методе, беря данные из data ¯\(ツ) – Алексей Шиманский Jul 19 '22 at 12:37
  • 2
    @АлексейШиманский это не синхронно. Если буквально читать вопрос, то автор хочет получить из async-фунции объект, а не промис. Что невозможно потому что async по определению возвращает промиc. – Alexey Ten Jul 19 '22 at 12:47
  • Все такие умные я в а.уе, минусуют сразу, предлагают закрыть вопрос, объяснить никто не попытался сразу начали заваливать, классика жанра – Anton Essential Jul 19 '22 at 12:48
  • Ну извините, но в описании минуса написано «Вопрос … не несёт пользы». Ваш вопрос именно такой, потому что это вопрос тут задают каждый день. – Alexey Ten Jul 19 '22 at 12:51
  • @AlexeyTen собственно с самого начала на мысль и навело что вероятно это в какой-то степени даже тупо, решил спросить. – Anton Essential Jul 19 '22 at 12:53
  • @AlexeyTen если в таком ключе, то да. получить чистое значение из async нельзя......но всё же суть автора чуть более широкая. Он хочет оперировать данными дальше. Вот основная суть я думаю. – Алексей Шиманский Jul 19 '22 at 12:54
  • @АлексейШиманский на эту суть в дубликате есть ответы – Alexey Ten Jul 19 '22 at 12:55
  • 2
    @AlexeyTen кстати нет. И я планирую туда дописать ответ наверное...... потому что уже сотый раз вижу, как люди, которые даже применяют async/await пытаются сделать функцию асинхронной, а потом вне её пытаются делать console.log или то, что автор..... то есть суть сводится к тому, что я описал в первом комментарии..... условно: вызывать асинхронщину, дождаться ответа, сложить её в переменную, а потом, когда-нибудь, не обязательно сразу, а может через N операций, воспользоваться данными из этой переменной...... – Алексей Шиманский Jul 19 '22 at 12:59
  • @АлексейШиманский – Anton Essential Jul 19 '22 at 13:02
  • @АлексейШиманский – Alexey Ten Jul 19 '22 at 13:14

1 Answers1

0

var url = 'https://www.binance.me/api/v3/ticker/price?symbols=%5B%22BTCUSDT%22,%22ETHUSDT%22,%22LTCUSDT%22,%22DOGEUSDT%22,%22TRXUSDT%22%5D';

const getData = async (url) => {

const response = await fetch(url);
const jsonObj = await response.json();

return jsonObj;

}

const json = getData(url); getData(url).then(response => { console.log(response); });


или так

var url = 'https://www.binance.me/api/v3/ticker/price?symbols=%5B%22BTCUSDT%22,%22ETHUSDT%22,%22LTCUSDT%22,%22DOGEUSDT%22,%22TRXUSDT%22%5D';

const getData = async (url) => {

const response = await fetch(url);
const jsonObj = await response.json();

return jsonObj;

}

(async function() { let response = await getData(url); console.log(response); })()

  • getData(url).then(response => {console.log(response);}); это и так понятно что внутри функции я получу массив, как вернуть в новую переменную объект из асинхронной функции что бы потом с ним работать дальше. Или это не возможно? – Anton Essential Jul 19 '22 at 12:23
  • ты итак получаешь данные в новую переменную и работаешь с ней дальше. что не так?)) второй пример смотри............ нужно понимать как именно ты хочешь с ней работать....не вижу пока никаких проблем во втором примере. ..........."Или это не возможно?" --- всё вполне возможно – Алексей Шиманский Jul 19 '22 at 12:29
  • мне нужно вытащить объект с ценами, потом их передать в график, там тоже объект, и в параметр value объекта графика нужно передать параметры price из async объекта, как-то так – Anton Essential Jul 19 '22 at 12:43
  • конечно удобнее было бы просто сохранить объект с ценами в отдельной переменной, и потом по ключам массива передать их в график и построить кривую, а сейчас получатся при обращении к переменной я получаю промис а там уже сам объект – Anton Essential Jul 19 '22 at 12:45
  • 1
    Честно говоря проблема не ясна. Например чем не устраивает второй вариант в ответе? Не знаю как у вас там, но условно можно иметь три метода: getData, renderChartByIds и showChart. Все они будут async. К примеру метод с именем showChart вызвается при клике на кнопку (показать график). Он в себе последовательно вызовет getData, положит данные в переменную, отфильтруешь данные как нужно и потом вызовет метод renderChartByIds с передачей отфитрованных данных..... – Алексей Шиманский Jul 19 '22 at 12:52
  • ну типо да ) придется так и делать, все методы async и там уже внутри копаться. – Anton Essential Jul 19 '22 at 13:06
  • 1
    да, но ведь по-другому и смысла нет делать. всё равно происходит какая-то операция. А операция - можно назвать функция или метод. вне функций уже мало что пишут...разве что hello world. А при асинке уже можно выделить несколько операций. – Алексей Шиманский Jul 19 '22 at 13:09