Подождите, пока весь запрос завершится и заполнится одновременно асинхронно

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

Вот пример того, как я делаю на самом деле

var q = knex.select().from('sector');
q.then(function (sectores) {
    var i = -1;
    (function getDetalles(sectores) {
        i++;
        if(i < sectores.length){
            knex.select().from('sector_detalle')
            .where('sector_id', sectores[i].id)
            .then(function (detalles) {
                // this what i want to do asynchronously
                sectores[i].sector_detalles = detalles;
                console.log(sectores[i]);
                getDetalles(sectores);
            });
        } else {
            res.send({sucess: true, rows: sectores});
        }
    })(sectores);
});

Я провел некоторое исследование и нашел это ждите всех обещаний финиш в nodejs с bluebird близок к тому, что я хочу, но не знаю, как реализовать


person Blas Pico    schedule 26.02.2015    source источник
comment
Я что-то упустил или ваш код не содержит цикла? Кроме того, разве этот полурекурсивный способ уже не работает - что вы хотите улучшить?   -  person Bergi    schedule 26.02.2015
comment
Есть ли причина запускать эти запросы последовательно, а не параллельно?   -  person Bergi    schedule 26.02.2015
comment
нет никаких причин, вы можете рассказать мне больше о? и спасибо за быстрый ответ   -  person Blas Pico    schedule 26.02.2015


Ответы (1)


Я думаю, вы ищете map метод, который работает с обещанием для массива и вызывает асинхронный (возвращающий обещание) обратный вызов для каждого из его элементов:

knex.select().from('sector').map(function(sector) {
    return knex.select().from('sector_detalle')
    .where('sector_id', sector.id)
    .then(function(detalles) {
        sector.sector_detalles = detalles;
        // console.log(sector);
        return sector;
    });
}).then(function(sectores) {
    res.send({sucess: true, rows: sectores});
});
person Bergi    schedule 26.02.2015
comment
я постараюсь рассказать вам, как это было - person Blas Pico; 26.02.2015