gpt4 book ai didi

node.js - 如何避免 nodejs 中的回调 hell 以进行 Sequelize

转载 作者:搜寻专家 更新时间:2023-11-01 00:32:12 26 4
gpt4 key购买 nike

我正在使用 Sequelize 并以回调 hell 告终:

db.Role.findAll().success(function(roles) {
db.User.findAll({where: {permission: 'coach'}}).success(function(coaches) {
res.render('users/edit_profile', {successFlash: successFlash, user: user, roles: roles, coaches: coaches});
}).error(function(errors) {
console.log("Error", errors);
res.render('dashboard', {successFlash: successFlash, errors: errors});
});
}).error(function(errors) {
console.log("Error", errors);
res.render('dashboard', {successFlash: successFlash, errors: errors});
});

我想避免回调 hell 并使代码更可重用。有没有办法在不使用异步、 promise 等的情况下做到这一点?

假设我写这样的东西..

get_user: function(req, res) {
var users = null;
users = func.get_users();
res.render('users/get_users', {users: users});
}

get_users: function() {
db.User.findAll().success(function(users){
return users;
}).error(function(err){
return null;
});
}

这种方法的问题在于,get_user 首先呈现页面,然后执行来自 get_users 的回调,给我的 users 始终为 null。

请在这方面帮助我!

提前致谢!

最佳答案

Sequelize 2.0 附带原生 promise ,因此您无需在代码中手动要求 promise 库。使用 2.0,您的代码片段可以写成:

db.Role.findAll().bind({}).then(function(roles) {
this.roles = roles;

return db.User.findAll({where: {permission: 'coach'}});
}).then(function(coaches) {
res.render('users/edit_profile', {successFlash: successFlash, user: user, roles: this.roles, coaches: coaches});
}).catch(function(errors) {
console.log("Error", errors);
res.render('dashboard', {successFlash: successFlash, errors: errors});
});

您只需要一个catch block ,因为当您返回 promise 时,任何错误都会传播到链的顶部。

bind({}) 部分使一个空对象在您的 promise 链中的所有函数内可用,因此您可以通过这种方式传递上下文。 If 也可以执行 bind(this),如果您希望能够从外部上下文访问某些内容,而不必执行惯用的 var self = this

关于node.js - 如何避免 nodejs 中的回调 hell 以进行 Sequelize ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27001123/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com