你可以使用它,事实上,如果我们都使用这种风格会很棒,它在你的代码中增加了很多可读性和灵活性(不再是回调地狱),但这不是使用它的方式。
正如@Cohars 所说,sails 期望一个函数作为控制器操作,你不能像 Koa 那样传递一个生成器,但这并不妨碍你使用它们,问题是 生成器本身非常没用,您需要一个调用它并对其进行迭代的函数,我相信 koa 在框架级别为您做到了这一点,但您在库级别有一些可用的选项,例如 @987654321 @ 或 yortus/asyncawait/ 这是我使用的,因为作为函数实现的节点光纤比 es6 生成器更灵活(尽管它们几乎相同),我会在几秒钟内告诉你为什么。
所以这里是你如何使用它:
首先npm install co 并在您的控制器中使用它,或者将其作为全局添加到 config/bootstrap.js 中,因为您将经常使用它。完成后,您可以在控制器中使用它。
module.exports = {
hi: function(req, res){
co(function* (){
// And you can use it with your models calls like this
let user = yield User.findOne(req.param('id'))
return res.send("Hi there" + user.name + "!");
})
}
};
就是这样
现在,如果您更愿意使用 async/await,它非常相似,如下所示:
module.exports = {
hi: function(req, res){
async(function(){
// Since await is a function, you can access properties
// of the returned values like this which is nice to
// access object properties or array indices
let userName = await(User.findOne(req.param('id'))).name
return res.send("Hi there" + userName + "!");
})();
}
};
有一个警告,如果您通过this 调用控制器的其他方法,请记住,如果您使用 async/await,它们将引用生成器 fn 或传递的常规 fn,所以一定要保存它的上下文,或者因为你已经在使用 es6 语法,你可以使用带有 async/await 的胖箭头,不幸的是不能使用 co,因为没有胖箭头版本的生成器(..yet?)
所以它会是这样的:
module.exports = {
hi: function(req, res){
async(() => {
let params = this._parseParams(req);
let userName = await(User.findOne(params.id)).name
return res.send("Hi there" + userName + "!");
})();
},
_parseParams: function(req){
let params = req.allParams()
// Do some parsing here...
return params
}
};
几个月来我一直在使用第二种方法,并且效果很好,我也尝试过使用 co 并且效果也很好,我只是更喜欢 async/await 模块(并且应该更快一点) 如果您使用的是咖啡脚本,那么它是完美的匹配,因为您的 sintax 将类似于 do async => await User.find()
更新:
我创建了一个包装器,如果您使用 yortus async/await 或检查源代码并根据需要修改它以与 co 或其他东西一起使用,您可以使用它。
这里是链接 https://www.npmjs.com/package/async-handler,处于 alpha 阶段,但我正在自己的应用程序上使用,并且可以按预期工作,如果没有提交问题。
这样 las 的示例将如下所示:
module.exports = {
hi: asyncHandler((req, res)->{
let params = this._parseParams(req);
let userName = await(User.findOne(params.id)).name
return res.send("Hi there" + userName + "!");
}),
_parseParams: function(req){
let params = req.allParams()
// Do some parsing here...
return params
}
};
使用此处理程序,您可以获得额外的好处,即如果异步/承诺错误没有被 try/catch 捕获,则它们可以在帆上正确传播