2016-04-25 4 views
0

Функция, которая извлекает данные.Цепь обещает при визуализации шаблона

Получить соединение и получить некоторые данные. Пропущенный код.

function executeSQL(sql, bindParams , options) { 
    return new Promise(function(resolve, reject) { 
    ... 
    resolve(result); 
    }); 
} 

контроллер, который использует эту функцию

exports.index = function(req, res){ 

    database.executeSQL('SELECT 1 FROM DUAL', [] , {}) 

    .then(function(result) { 
     res.render('index' , { TITLE : 'Lorem Ipsum Blog' }); 
    }) 

    .catch(function(err) { 
     next(err); 
    }); 
}; 

Мой index контроллер используется в моем index маршруте.

Мне нужно будет вызвать функцию executeSQL как минимум дважды. Только после того, как оба они сделаны, я хочу позвонить res.render и отправить свои данные, которые я получил.

Как их связать? Нужно ли мне их связывать? Могу ли я просто выполнить их асинхронно, и как только они будут выполнены, я вызываю res.render.

+3

Как насчет 'Promise.all (обр) .then'? – Rayon

+0

@RayonDabre Когда я запускаю console.log on on result1, он возвращает undefined. Моя функция рендеринга не получает результаты от этих двух обещаний. – Paran0a

+0

My Bad ... Обратитесь к этому: https://jsfiddle.net/rayon_1990/Lson6f62/1/ – Rayon

ответ

1

Использование Promise.all, Метод Promise.all (iterable) возвращает обещание, которое разрешает, когда все обещания в аргументе итерации разрешены.

function executeSQL(sql, bindParams, options) { 
 
    return new Promise(function(resolve, reject) { 
 
    resolve(result); 
 
    }); 
 
} 
 
exports.index = function(req, res) { 
 
    var pro1 = database.executeSQL('SELECT 1 FROM DUAL', [], {}); 
 
    var pro2 = database.executeSQL('SELECT 1 FROM DUAL', [], {}); 
 
    Promise.all([pro1, pro2]).then(function(result) { 
 
    console.log(result); //result will be an array 
 
    res.render('index', { 
 
     TITLE: 'Lorem Ipsum Blog' 
 
    }); 
 
    }).catch(function(err) { 
 
    next(err); 
 
    }); 
 
};

Смежные вопросы