Nodejs 一段 node.js 代码,如何优化防止 callback hell?
Nodejs 一段 node.js 代码,如何优化防止 callback hell?
users.userExists({
username: username
}, function(err, exists) {
if (err) {
users.close();
console.error(‘Error testing if user exists: ’ + err);
response.error = ‘业务忙,请稍候重试’;
res.status(HttpStatus.INTERNAL_SERVER_ERROR).json(response);
return;
} else if (exists) {
users.close();
response.error = ‘用户名已经存在’;
res.status(HttpStatus.CONFLICT).json(response);
return;
} else {
users.emailExists(profile.email, function(err, exists) {
console.log(profile.email +’ ’ + exists);
if (err) {
users.close();
console.error(‘checking email error’);
response.error = ‘业务忙,请稍候重试’;
res.status(HttpStatus.INTERNAL_SERVER_ERROR).json(response);
return;
} else if (exists) {
users.close();
response.error = ‘邮箱 ’ + profile.email + ’ 已存在’;
res.status(HttpStatus.CONFLICT).json(response);
return;
}
users.createUser(username, password, profile, function(err, uid, hash) {
if (err) {
response.error = ‘生成用户错误’;
console.error('Failed to create user ’ + err);
res.status(HttpStatus.INTERNAL_SERVER_ERROR).json(response);
} else {
response.statusMessage = ‘成功生成用户’;
response.uid = uid;
// best-effort without a callback
res.json(response);
}
});
});
}
})
用 async + await
你都知道 callback hell 了,为什么不知道 Promise
Promise 模式,还可以加点 ES2015 语法糖会更甜。
如果闲的蛋疼的话可以试试 http://fsprojects.github.io/Fable/
最后结果类似这样F#<br>async {<br> try<br> let! exists = users.userExists({username: username})<br> if exists:<br> res.status(HttpStatus.CONFLICT).json(response);<br> return;<br> try:<br> let! users.emailExists(profile.email)<br> if exists:<br> response.error = '邮箱 ' + profile.email + ' 已存在';<br> res.status(HttpStatus.CONFLICT).json(response);<br> return <br> try:<br> let! (uid, hash) = users.createUser(username, password, profile)<br> response.statusMessage = '成功生成用户';<br> response.uid = uid;<br> res.json(response);<br> except err:<br> response.error = '生成用户错误';<br> console.error('Failed to create user ' + err);<br> res.status(HttpStatus.INTERNAL_SERVER_ERROR).json(response);<br><br> except err:<br> console.error('checking email error');<br> response.error = '业务忙,请稍候重试';<br> res.status(HttpStatus.INTERNAL_SERVER_ERROR).json(response); <br> except err: <br> console.error('Error testing if user exists: ' + err);<br> response.error = '业务忙,请稍候重试'<br> res.status(HttpStatus.INTERNAL_SERVER_ERROR).json(response);<br> finally:<br> users.close()<br>}<br><br>
擦 , 空格都没了
co 模块
Promise 、 Generator 、 co 、 async+await
总有一款适合你
Promise + Generator + co 看起来优雅点,然而概念让人乱乱的
目前最合适的是 co