我似乎无法掌握如何使用NodeJ维护异步控制流程。在我看来,所有嵌套都使得代码很难阅读。我是新手,所以我可能错过了大局。
简单编码这样的东西有什么问题......
function first() {
var object = {
aProperty: 'stuff',
anArray: ['html', 'html'];
};
second(object);
}
function second(object) {
for (var i = 0; i < object.anArray.length; i++) {
third(object.anArray[i]);
};
}
function third(html) {
// Parse html
}
first();
答案 0 :(得分:7)
“大图”是任何I / O都是非阻塞的,并且在JavaScript中异步执行;因此,如果您进行任何数据库查找,从套接字(例如在HTTP服务器中)读取数据,将文件读取或写入磁盘等,则 使用异步代码。这是必要的,因为事件循环是单个线程,如果I / O不是非阻塞,程序将在执行时暂停。
你可以构建你的代码,以便嵌套更少;例如:
var fs = require('fs');
var mysql = require('some_mysql_library');
fs.readFile('/my/file.txt', 'utf8', processFile);
function processFile(err, data) {
mysql.query("INSERT INTO tbl SET txt = '" + data + "'", doneWithSql);
}
function doneWithSql(err, results) {
if(err) {
console.log("There was a problem with your query");
} else {
console.log("The query was successful.");
}
}
还有像async这样的流量控制库(我个人选择),以帮助避免大量嵌套回调。
答案 1 :(得分:1)
正如@BrandonTilley所说,I / O是异步的,所以你需要在Node.js中进行回调来处理它们。这就是为什么Node.js只用一个线程就可以做到这么多(它实际上并没有在一个线程中做更多的事情,而是让线程等待数据,它只是开始处理下一个任务而且当我/ O回来了,然后它会用你给它的回调函数跳回到那个任务。)
但是,嵌套回调可以通过一个好的库来处理,比如古老的async或我的新小库:queue-flow。它们处理回调问题,让您保持代码不嵌套,看起来非常类似于阻塞,同步代码。 :)