4

我似乎无法掌握如何使用 NodeJs 维护异步控制流。在我看来,所有的嵌套使得代码很难阅读。我是新手,所以我可能错过了大局。

简单地编写这样的代码有什么问题......

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

2 回答 2

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(我个人的选择)这样的流控制库来帮助避免大量嵌套回调。

您可能对我创建的有关该主题的截屏视频感兴趣。

于 2012-07-21T17:26:12.377 回答
1

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

但是,嵌套回调可以通过一个好的库来处理,比如古老的async或我的新小库:queue-flow。它们处理回调问题,让您的代码保持非嵌套,看起来非常类似于阻塞、同步代码。:)

于 2012-07-21T17:32:28.050 回答