Как сделать Promise.then синхронным?

227
11 января 2018, 23:58

Хочу сделать получение из XML дерева элементов по CSS запросам (NativeScript).

Использовать как ниже не очень хочется, т.к. получение элемента после другого элемента будет выглядеть просто ужасно.

cq('query', $elem => {
    $elem.on('trigger', a => {
        cq('query', $elem => {
            $elem.on('trigger', a => {...})
        });
    })
});

Поэтому я решил через промис ждать ответ, а через прокси возвращать значение из .then(), но столкнулся с тем, что:

  1. .then() асинхронен тоже
  2. .then() возвращает промис

Код:

function init(query) {
    let promise =  new Promise(on_done => {
        get_component(parse_query(query), on_done);
        // Функции, которые всё это обрабатывают. После выполняется on_done(результат)
    });
    let proxy = new Proxy(promise, {
        get(pr, prop) {
            pr.then(obj => {
                if(typeof obj[prop] == 'function') {
                    let fn_proxy = new Proxy(obj[prop], {
                        apply(fn, t_arg, fn_args) {
                            return fn.apply(obj, fn_args);
                        }
                    });
                    pr.result = fn_proxy;
                } else {
                    pr.result = obj[prop];
                }
            });
            return pr.result;
        }
    });
    return proxy;
}

Есть идеи, что можно сделать?

EDIT #1:

Временным (хотя наверное постоянным) решением было принято

async function init(query) {
    let promise = new Promise(on_done => {
        get_component(parse_query(query), on_done);
    });
    return await promise;
}

И использование:

let $elem = await cq('query');
$elem.on('trigger', a => {
    let $elem2 = await cq('query2');
    $elem2.on('trigger', a => {...});
})
READ ALSO
Сравнение двух вложенных массива

Сравнение двух вложенных массива

Есть 2 вложенных массивава:

179
Задачи по Vue JS [требует правки]

Задачи по Vue JS [требует правки]

Начал изучение Vue JS, можете посоветовать какие-нибудь интересные задачки по Vue для наработки практики, желательно не супер сложные (тк

641