如何解决回调地狱和重构
我一直在学习JavaScript,并开始探索Node。我已经花了一些时间来了解回调地狱以及如何解决它,但是现在我比以往任何时候都更加迷失了方向,我开始认为我正在向后看(这可能是一个愚蠢的问题)。我已经阅读了callbackhell.com的指南,第1条规则是保持代码浅。
这里是连接数据库,然后读取文件,将记录插入到MongoDB并进行日志记录的示例:
Tcoord_augmented
在该示例中,我有3个匿名回调函数,而且由于在整个回调过程中都使用db,因此我不知道如何重构。据我了解,我应该针对3个命名函数(或者我缺少什么?)并这样称呼它:
MongoClient.connect(url,(err,db)=>{
let dbo = db.db('test');
fs.readFile('./data.json',data)=>{
let records = JSON.parse(data);
dbo.collection('people').insertMany(records,result) =>{
console.log("result");
db.close();
})
});
});
和类似的功能:
MongoClient.connect(url,cb1);
寻找有关回调地狱的任何见解。这是回调地狱吗?我将如何处理?我在概念上缺少什么吗?甚至应该重构吗?
PS。 Promises和Async / Await可以等到我了解如何使用回调进行异步编程
谢谢!
解决方法
嵌套回调实际上就是通常所说的回调地狱。
您尝试将回调分为命名函数很好,但是您已经意识到一个问题:在所有回调中都需要对db
对象的引用,而该引用并不存在。
您可以通过将this
绑定到db
或通过绑定(第一个)参数来传递该db
对象作为参数来解决此问题。原理是真的。
将this
绑定到db
对象的情况如下:
function cb1(err,db) {
let dbo = db.db('test');
fs.readFile('./data.json',cb2.bind(db));
}
function cb2(err,data) {
let records = JSON.parse(data);
this.collection('people).insertMany(records,cb3.bind(this));
}
function cb3(err,result) {
console.log(result);
this.close();
}
这是带有额外参数的外观:
function cb1(err,cb2.bind(null,db));
}
function cb2(db,err,data) {
let records = JSON.parse(data);
db.collection('people).insertMany(records,cb3.bind(null,db));
}
function cb3(db,result) {
console.log(result);
db.close();
}
下一步将是接受诺言和async
await
语法。例如参见"How to use MongoDB with promises in Node.js?"。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。