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 : ‘’
});
}
});


6 回复

为了改善嵌套的代码结构,可以使用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 }); });

可以用 when.js 或者promise

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或更高版本,则可以直接使用原生的asyncawait功能,而无需额外安装库。

回到顶部