Nodejsasynchronous混乱

我似乎无法理解如何保持与NodeJs的asynchronous控制stream。 所有的嵌套使得我的代码很难阅读。 我是新手,所以我可能错过了大局。

简单地编码这样的东西有什么错

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(); 

“大图”是,任何I / O都是非阻塞的,并在JavaScript中asynchronous执行; 所以如果你做任何数据库查找,从一个套接字(例如在HTTP服务器)读取数据,读取或写入文件到磁盘等,你必须使用asynchronous代码。 这是必要的,因为事件循环是单线程的,如果I / O不是非阻塞的,程序会在执行时暂停。

可以构造你的代码,使嵌套更less; 例如:

 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."); } } 

还有像asynchronous (我个人的select)stream量控制库,以帮助避免大量的嵌套callback。

您可能对我在这个主题上创build的这个截屏有兴趣。

正如@BrandonTilley所说,I / O是asynchronous的,所以你需要 Node.js中的callback来处理它们。 这就是为什么Node.js只需要一个线程就可以做到这一点(实际上它并不是在单个线程中做更多的事情,而是让线程等待数据,它只是开始处理下一个任务,而当I / O回来,然后用你给它的callback函数跳回到那个任务)。

但是,嵌套的callback可以采取一个好的库,如古老的asynchronous或我的新的小库: 队列stream 。 他们处理callback问题,并让你的代码不嵌套,看起来非常类似于阻塞,同步代码。 🙂