Ответы пользователя по тегу Асинхронное программирование
  • Как вернуть значение из асинхронной функции?

    @DimaIs
    Async/await вам в этом случае не поможет, необходимо переделать реализацию под промисы
    Статься про промисы
    Касательно решения: вам необходимо резолвить промис со значением в виде обьекта с необходимыми данными, промис резолвится функцией resolve, которая передается первым аргументом коллбека, передаваемого в конструктор промиса:
    interface IImageSize {
        width: number;
        height: number;
    }
    
    const getImageSize = (imageDataUrl: string): Promise<IImageSize> =>
        new Promise((resolve): void => {
            //Создаем промис, его же и возвращаем
            const image = new Image();
            image.src = imageDataUrl;
    
            image.onload = () => {
                const { width, height } = image;
                const imageSize: IImageSize = {
                    width,
                    height,
                };
                resolve(imageSize); // резолвим промис с необходимым нам обьектом
            };
        });
    
     // вызываем функцию либо внутри другой асинхронной функции, дабы был доступен оператор await
    const anyFunction = async (): Promise<void> => {
        const imageSize: IImageSize = await getImageSize("<any_image_url>");
        const { width, height } = imageSize;
    };
    
    //либо поступаем как с любым другим промисом
    getImageSize("<any_image_url>").then((imageSize: IImageSize): void => {
        const { width, height } = imageSize;
    });
    Ответ написан
    2 комментария
  • NodeJS async\await в классах ES6, не работает?

    @DimaIs
    Если вы хотите вызывать ваши функции после сработки коллбека запроса к БД, то нужно либо:
    1) Указать эти функции уже внутри коллбека (он сам вызовет эти функции)
    2) Промисифировать функцию вызова бд, чтобы можно было применять к ней await (или then, кому как удобно):
    const runBdQuery = query =>  new Promise((resolve, reject) => {
            deDB.run(query, function(err) {
                if (err)
                       reject(err);
                   res = true;
                   resolve(res) // тут все что угодно
         	    console.log('Step1');
      	});
        })

    Далее можно делать так:
    const makeQuery = async () => {
        const query = "SELECT id, dt FROM meta";
        await runBdQuery(query);
        await step1();
       ----------
         await step6();
    }
    makeQuery();
    Ответ написан
    5 комментариев