简体   繁体   中英

Promise.all(…).spread is not a function when running promises in parallel

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?

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

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

这是Bluebird Promise功能,您可以通过Sequelize.Promise访问它,而无需安装Bluebird模块本身

Sequelize.Promise.all(promises).spread(...)

I needed to install BlueBird.

npm install bluebird

Then:

var Promise = require("bluebird");

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM