Promise.all(...).spread在并行运行promises时不是一个函数

Fil*_*ano 13 javascript node.js promise sequelize.js

我试图用sequelize在paralel中运行2个promise,然后在.ejs模板中渲染结果,但是我收到了这个错误:

 Promise.all(...).spread is not a function
Run Code Online (Sandbox Code Playgroud)

这是我的代码:

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

});
Run Code Online (Sandbox Code Playgroud)

我怎么解决这个问题?

jfr*_*d00 32

我会对答案进行评论,因为它解决了您的问题.

.spread()不是标准的承诺方法.它可以在Bluebird promise库中找到.您包含的代码没有显示.三种可能的解决方

直接访问数组值

你可以使用.then(results => {...})和访问结果results[0]results[1].

包括Bluebird Promise库

您可以包含Bluebird promise库,以便您可以访问.spread().

var Promise = require('bluebird');
Run Code Online (Sandbox Code Playgroud)

在回调参数中使用destructuring

在nodejs的最新版本中,您还可以使用解构赋值,这样就不需要.spread()这样:

Promise.all([template,list]).then(function([templates,lists]) {
    res.render('campaign/create.ejs', {templates, lists});
});
Run Code Online (Sandbox Code Playgroud)


vp_*_*rth 16

您可以在没有非标准Bluebird功能的情况下编写它,并保持较少的依赖性.

Promise.all([template,list])
  .then(function([templates,lists]) {
  };
Run Code Online (Sandbox Code Playgroud)

ES6解构分配

Promise.all([
  Promise.resolve(1),
  Promise.resolve(2),
]).then(([one, two]) => console.log(one, two));
Run Code Online (Sandbox Code Playgroud)