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
});
});
どうすれば解決できますか?
あなたの問題を解決したので、コメントを回答にします。
.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});
});
_
非標準のBluebird
機能を使用せずに記述し、依存関係を少なくすることもできます。
Promise.all([template,list])
.then(function([templates,lists]) {
};
Promise.all([
Promise.resolve(1),
Promise.resolve(2),
]).then(([one, two]) => console.log(one, two));
これはBluebird
Promise機能であり、Bluebird
モジュール自体をインストールせずにSequelize.Promise
経由でアクセスできます。
Sequelize.Promise.all(promises).spread(...)
BlueBirdをインストールする必要がありました。
npm install bluebird
次に:
var Promise = require("bluebird");