问题
I'm trying to run 2 promises in paralel with sequelize, and then render the results in a .ejs template, but I'm receiving this error:
Promise.all(...).spread is not a function
This is my 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
});
});
How can I solve thhis?
回答1:
I'll make my comment into an answer since it solved your issue.
.spread() is not a standard promise method. It is available in the Bluebird promise library. Your code you included does not show that. Three possible solutions:
Access array values directly
You can just use .then(results => {...}) and access the results as results[0] and results[1].
Include the Bluebird Promise library
You can include the Bluebird promise library so you have access to .spread().
var Promise = require('bluebird');
Use destructuring in the callback arguments
In the latest versions of nodejs, you could also use destructuring assignment which kind of removes the need for .spread() like this:
Promise.all([template,list]).then(function([templates,lists]) {
res.render('campaign/create.ejs', {templates, lists});
});
回答2:
You can write it without non-standard Bluebird features and keep less dependencies as well.
Promise.all([template,list])
.then(function([templates,lists]) {
};
ES6 Destructuring assignment
Promise.all([
Promise.resolve(1),
Promise.resolve(2),
]).then(([one, two]) => console.log(one, two));
回答3:
This is a Bluebird Promise feature and you can access it via Sequelize.Promise without installing Bluebird module itself
Sequelize.Promise.all(promises).spread(...)
回答4:
I needed to install BlueBird.
npm install bluebird
Then:
var Promise = require("bluebird");
来源:https://stackoverflow.com/questions/42750254/promise-all-spread-is-not-a-function-when-running-promises-in-parallel