Ожидание асинхронной лямбда-функции gjs

Я пытаюсь заставить асинхронные вызовы ниже (они асинхронны из-за внешнего API, а не моего дизайна) для последовательного запуска, теперь мне удалось дождаться foo функцией вызова, но у меня проблемы с ожиданием foo2 потому что я получаю следующую ошибку в асинхронной строке

ОШИБКА JS: SyntaxError: отсутствует) после списка аргументов

Что мне не хватает?

ps: также есть ли лучший способ «вернуть» значение из обратного вызова, чем установка глобальной переменной и доступ к ней извне?

 foo(nick) {
        return new Promise((resolve, reject) async () => {
            async_foo(par, [],
                (c, res) => {
                    let par2;
                    try {
                        par2 = c.somefun(res);
                    } catch (e) {
                        logError(e, `Some error`);
                        return;
                    }

                    let output = await this.foo2(par2);

                    resolve(output);
                });
        });
    }
 foo2(par2) {
        return new Promise((resolve, reject) => {
            par2.asyncfun(
                null, this.callback.bind(this, par2));
        });
    }

заранее спасибо


gjs
person Roberto Sánchez    schedule 09.04.2020    source источник
comment
Обратите внимание, что (resolve, reject) async () => { ... } является недопустимым синтаксисом, я полагаю, что именно отсюда исходит ошибка. Вам, вероятно, нужно удалить async () здесь.   -  person ptomato    schedule 10.04.2020


Ответы (1)


Я думаю, вы просто пытаетесь сделать слишком много в одном промисе:

async function(nick) {
    let res1 = await new Promise((resolve, reject) => {
        async_foo(par, [], (c, res) => {
            try {
                resolve(async_foo_finish(res));
            } catch (e) {
                reject(e);
            }
        });
    });

    return new Promise((resolve, reject) => {
        res1.asyncfunc(null, (obj, res) => {
            try {
                resolve(obj.asyncfun_finish(res));
            } catch (e) {
                reject(e);
            }
        });
    });
}

foo('something').then(output => {
    log('output');
}).catch(e => {
    logError(e);
});

Трудно дать хороший совет, так как вы не показываете реальных функций.

Одна из основных целей Promises/async-await — избежать сложной вложенности обратных вызовов. Как правило, вы должны разбить свою цепочку функций на отдельные промисы, а затем await их один за другим.

person andy.holmes    schedule 09.04.2020