2016-04-25 17 views
0

Funktion, die Daten abruft.Kette verspricht beim Rendern der Vorlage

Holen Sie sich eine Verbindung und holen Sie einige Daten. Einen Code ausgelassen.

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

-Controller, der diese Funktion verwendet

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); 
    }); 
}; 

Mein index Controller in meiner index Route verwendet wird.

Ich muss meine executeSQL-Funktion mindestens zweimal aufrufen. Erst nachdem beide fertig sind, möchte ich res.render anrufen und meine Daten, die ich abgerufen habe, einsenden.

Wie kann ich sie verketten? Muss ich sie sogar verketten? Kann ich sie nur asynchron ausführen und sobald sie beide fertig sind, rufe ich res.render.

+3

Wie wäre es 'Promise.all (arr) .then'? – Rayon

+0

@RayonDabre Wenn ich console.log on on result1 starte, gibt es undefined zurück. Meine Renderfunktion erhält nicht die Ergebnisse dieser beiden Versprechen. – Paran0a

+0

Mein Schlechter ... Verweise: https://jsfiddle.net/rayon_1990/Lson6f62/1/ – Rayon

Antwort

1

Verwendung Promise.all, Die Promise.all (iterable) -Methode gibt eine Zusage zurück, die aufgelöst wird, wenn alle Versprechen im iterablen Argument aufgelöst wurden.

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); 
 
    }); 
 
};