【发布时间】:2017-08-02 16:18:23
【问题描述】:
我正在尝试使用 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()不是标准的承诺方法。它在 Bluebird Promise 库中可用 - 你在使用它吗?您包含的代码没有显示这一点。您也可以只使用.then(results => {...})并以results[0]和results[1]访问结果。 -
谢谢,我不知道。我导入了 BlueBird,它现在可以工作了。
-
"I'm trying to run 2 promises in parallel".不,你不是因为你不能,因为 JS 是单线程的。你正在处理的是你不知道哪个承诺会先结束。 -
@ankitbug94,不过还是可以并行IO操作。
-
根据我之前的评论,我发布了一个答案,为您提供了三种不同的解决方案。其中最优雅的是使用破坏来完全消除对
.spread()的需要,尽管出于以下原因我仍然推荐 Bluebird:Are there still reasons to use promise libraries like Q or BlueBird now that we have ES6 promises?
标签: javascript node.js promise sequelize.js