web-dev-qa-db-fra.com

Promise.all (...). Spread n'est pas une fonction lors de l'exécution de promesses en parallèle

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?

13
Filipe Ferminiano

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

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));
17
vp_arth

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(...)
1
piotrbienias

J'avais besoin d'installer BlueBird.

npm install bluebird

Alors:

var Promise = require("bluebird");
0
Filipe Ferminiano