Задать вопрос
Sanu0074
@Sanu0074

Почему не работает async/await?

Использую typescript ("lib": ["dom", "es2015.promise", "es5"])
Такой пример:
function exec(url) {
    return new Promise(resolve => {
        let responce = null;
        $.ajax({
            type: 'GET',
            url: url
        }).done((data) => {
            resolve(data);
        });
    });
}

async function request(url) {
    return await exec(url);
}

let data = request('/ru/catalog');
console.log(data);

этот пример возвращает:

[[PromiseStatus]]: "pending"
[[PromiseValue]]: "["undefined"]"

Все из-за того что до resolve не доходит, а возвращается промис. Как его заставить ждать чтоб вернуть данные (data) вместо промиса?
  • Вопрос задан
  • 3697 просмотров
Подписаться 2 Оценить Комментировать
Решения вопроса 1
@vshvydky
Чтобы не рос колбек ад, используй конструкцию внутри которой будет весь асинк код.
async function  request(url) {(
        try {
            await function(){
                $.ajax({
                    type: 'GET',
                    url: url,
                    success: (data) =>{
                        return data;
                    }
                })
            };
        } catch (error) {
            console.error(error);
            throw error;
        }
}

(async ()=>{
   try {
      await ....
      // весь асинк код
      let data = await request('/ru/catalog');
      console.log(data);
       return 1;
} catch (error) {
      console.error(error);
      throw error;
   }
})();

Ретурн и фроу обязательны, потому как по факту ты описываешь промис и после () можешь дальше вермишелить then catch и так далее
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@Stepanya
let data = await request('/ru/catalog');

let data = request('/ru/catalog').then((data) => console.log(data));
Ответ написан
@netW0rm
await работает только внутри функции объявленной как async.
Я обычно делаю так
main()
async function main() {
  ...
  let data = await request('/ru/catalog')
  ...
}
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы