J'essaie d'exécuter 2 promesses en parallèle avec sequelize, puis de rendre les résultats dans un modèle .ejs, mais je reçois cette erreur:
Promise.all(...).spread is not a function
Voici mon code:
var environment_hash = req.session.passport.user.environment_hash;
var Template = require('../models/index').Template;
var List = require('../models/index').List;
var values = {
where: { environment_hash: environment_hash,
is_deleted: 0
}
};
template = Template.findAll(values);
list = List.findAll(values);
Promise.all([template,list]).spread(function(templates,lists) {
res.render('campaign/create.ejs', {
templates: templates,
lists: lists
});
});
Comment puis-je résoudre ça?
Je ferai de mon commentaire une réponse car il a résolu votre problème.
.spread()
n'est pas une méthode de promesse standard. Il est disponible dans la bibliothèque de promesses Bluebird. Votre code que vous avez inclus ne le montre pas. Trois solutions possibles:
Accéder directement aux valeurs du tablea
Vous pouvez simplement utiliser .then(results => {...})
et accéder aux résultats en tant que results[0]
Et results[1]
.
Inclure la bibliothèque Bluebird Promise
Vous pouvez inclure la bibliothèque de promesses Bluebird afin d'avoir accès à .spread()
.
var Promise = require('bluebird');
tilisez la déstructuration dans les arguments de rappel
Dans les dernières versions de nodejs, vous pouvez également utiliser l'affectation de déstructuration, ce qui supprime le besoin de .spread()
comme ceci:
Promise.all([template,list]).then(function([templates,lists]) {
res.render('campaign/create.ejs', {templates, lists});
});
Vous pouvez l'écrire sans les fonctionnalités Bluebird
non standard et conserver également moins de dépendances.
Promise.all([template,list])
.then(function([templates,lists]) {
};
mission de déstructuration ES6
Promise.all([
Promise.resolve(1),
Promise.resolve(2),
]).then(([one, two]) => console.log(one, two));
Il s'agit d'une fonctionnalité de promesse Bluebird
et vous pouvez y accéder via Sequelize.Promise
sans installer Bluebird
module lui-même
Sequelize.Promise.all(promises).spread(...)
J'avais besoin d'installer BlueBird.
npm install bluebird
Alors:
var Promise = require("bluebird");