Nodejs如何改变嵌套的写法,帮忙修改下面的代码..如果判断业务很多的话,代码都成歪的了..
Nodejs如何改变嵌套的写法,帮忙修改下面的代码…如果判断业务很多的话,代码都成歪的了…
babyModel.Baby.find({
}).count(function(err, cnt) {
if(cnt) {
babyModel.Baby.find({
}, {}, {
skip : start,
limit : limit,
sort : {
‘updateDate’ : -1
}
}, function(err, results) {
if(err) {
log.logger.error(‘babyList find error:’ + err);
} else {
res.send({
totalCount : cnt,
data : results
});
}
});
} else {
res.send({
totalCount : 0,
data : ‘’
});
}
});
为了改善嵌套的代码结构,可以使用async/await
语法来简化回调地狱(callback hell)。通过这种方式,你可以让异步操作看起来更像同步代码,从而提高可读性和维护性。
以下是修改后的代码示例:
const async = require('async'); // 如果没有安装async模块,可以通过npm install async --save来安装
async function getBabyList(babyModel, start, limit) {
try {
const cnt = await new Promise((resolve, reject) => {
babyModel.Baby.find({}).count((err, count) => {
if (err) return reject(err);
resolve(count);
});
});
if (cnt > 0) {
const results = await new Promise((resolve, reject) => {
babyModel.Baby.find({}, {}, {
skip: start,
limit: limit,
sort: {
'updateDate': -1
}
}, (err, docs) => {
if (err) return reject(err);
resolve(docs);
});
});
return {
totalCount: cnt,
data: results
};
} else {
return {
totalCount: 0,
data: []
};
}
} catch (error) {
log.logger.error('Error occurred:', error);
return {
totalCount: 0,
data: []
};
}
}
// 调用函数
getBabyList(babyModel, start, limit)
.then(result => {
res.send(result);
})
.catch(error => {
log.logger.error('Final error:', error);
res.status(500).send({ message: 'Internal Server Error' });
});
在这个示例中,我们首先引入了async
库,并定义了一个名为getBabyList
的异步函数。该函数使用await
关键字来等待异步操作完成,而不是使用传统的回调函数。这样可以使代码更加简洁、易读。
注意,在实际应用中,你可能需要根据具体的业务需求调整错误处理逻辑。例如,你可以选择将错误信息返回给客户端或记录到日志文件中。
手动置顶
eventproxy来一发
var eventproxy = require('eventproxy');
var ep = eventproxy.create();
ep.fail(function (err) {
log.logger.error(err);
});
babyModel.Baby.find({}),count(ep.doneLater(‘count’));
ep.on(‘count’, function (cnt) {
if (!ctn) {
return ep.emit(‘results’, []);
}
babyModel.Baby.find({}, {}, {
skip : start,
limit : limit,
sort : {
‘updateDate’ : -1
}
}, ep.done(‘results’));
});
ep.all(‘count’, ‘result’, function (cnt, results) {
res.send({
totalCount: cnt,
data: results
});
});
async的waterfall,或者把函数提取出来使用闭包在使用的时候生成,就可以消除金字塔了,node金字塔总是一不小心就搭得很高
为了改善嵌套回调的问题,可以使用async/await
语法来使代码更易于阅读和维护。下面是修改后的代码示例:
const async = require('async');
async function getBabyList(start, limit, res) {
try {
const cnt = await new Promise((resolve, reject) => {
babyModel.Baby.find({}).count((err, cnt) => {
if (err) return reject(err);
resolve(cnt);
});
});
if (cnt) {
const results = await new Promise((resolve, reject) => {
babyModel.Baby.find({}, {}, {
skip: start,
limit: limit,
sort: {
'updateDate': -1
}
}, (err, results) => {
if (err) return reject(err);
resolve(results);
});
});
res.send({
totalCount: cnt,
data: results
});
} else {
res.send({
totalCount: 0,
data: []
});
}
} catch (error) {
log.logger.error('babyList find error:', error);
}
}
在这个示例中,我们引入了async
模块,并将代码封装在一个名为getBabyList
的异步函数中。通过使用await
关键字,我们可以在不使用回调的情况下等待异步操作的结果。这样可以使代码更清晰易读,特别是在处理大量业务逻辑时。
注意:上述示例假设您已经安装并正确配置了async
库。如果您使用的是Node.js 7.6或更高版本,则可以直接使用原生的async
和await
功能,而无需额外安装库。