web-dev-qa-db-ja.com

Promise.all(...)。spreadは、Promiseを並行して実行する場合の関数ではありません

Sequelizeを使用して並列で2つのpromiseを実行し、結果を.ejsテンプレートでレンダリングしようとしていますが、このエラーが表示されます。

 Promise.all(...).spread is not a function

これは私のコードです:

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

});

どうすれば解決できますか?

13

あなたの問題を解決したので、コメントを回答にします。

.spread()は標準のpromiseメソッドではありません。 Bluebird promiseライブラリで利用可能です。含めたコードには表示されません。 3つの可能な解決策:

配列値に直接アクセスする

.then(results => {...})を使用して、結果に_results[0]_および_results[1]_としてアクセスできます。

Bluebird Promiseライブラリを含む

.spread()にアクセスできるように、Bluebird promiseライブラリを含めることができます。

_var Promise = require('bluebird');
_

コールバック引数で構造化を使用

Nodejsの最新バージョンでは、次のように.spread()の必要性をなくすような構造化割り当てを使用することもできます。

_Promise.all([template,list]).then(function([templates,lists]) {
    res.render('campaign/create.ejs', {templates, lists});
});
_
33
jfriend00

非標準のBluebird機能を使用せずに記述し、依存関係を少なくすることもできます。

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

これはBluebird Promise機能であり、Bluebirdモジュール自体をインストールせずにSequelize.Promise経由でアクセスできます。

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

BlueBirdをインストールする必要がありました。

npm install bluebird

次に:

var Promise = require("bluebird");
0