node.js - Nodejs异步混淆

标签 node.js asynchronous

我似乎无法掌握如何使用 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();

最佳答案

“大图”是任何 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这样的流量控制库(我个人的选择)有助于避免大量嵌套回调。

您可能对 this screencast I created on the subject 感兴趣.

关于node.js - Nodejs异步混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11594303/

相关文章:

javascript - Node.js 在 API 调用上循环

node.js - Jsonwebtoken 验证总是只返回 {iat : xxx }

javascript - 拥抱或对抗 Node 缺乏类型安全的问题

javascript - 如何使用 JavaScript 中的 moment.js/Date 将 EST 时间数据转换为本地时间

ios - 从 Swift 函数中的异步调用返回数据

c# - 在基类上使用虚拟异步方法可以吗?

javascript - 在定制的 for-each 循环中链接回调,同时支持同步和异步函数

javascript - 在本地主机上运行 Node JS 服务器

python - 如何使用多处理在Python中运行多个异步进程?

javascript - 在 Node.js 中异步读写文件