Node.js 异步编程

下面的代码显示了Node.js如何处理非阻塞的异步模型。

setTimeout()函数接受调用一个函数,并在超时之后应该调用它:

  1. setTimeout(function () {
  2. console.log("done");
  3. }, 2000);
  4. console.log("waiting");

如果运行上述代码,你将看到以下输出:

setTimeout()函数结果

程序将超时设置为2000ms(2s),然后继续执行,打印出“waiting"文本。

在Node.js中,调用一个函数需要等待一些外部资源,我们应该调用fopen(path,mode,function callback(file_handle){…}),而不是调用fopen(path,mode)和waiting。

例子

下面的代码为异步函数。

  1. var fs = require("fs");
  2. fs.open(
  3. "a.js", "r",
  4. function (err, handle) {
  5. var buf = new Buffer(100000);
  6. fs.read(
  7. handle, buf, 0, 100000, null,
  8. function (err, length) {
  9. console.log(buf.toString("utf8", 0, length));
  10. fs.close(handle, function () { /* don"t care */ });
  11. }
  12. );
  13. }
  14. );

上面的代码生成以下结果。

异步函数结果

注意

require函数是一种在Node.js程序中包含附加功能的方法。

回调异步函数有至少一个参数,最后操作的成功或失败状态。它通常具有第二参数,其具有来自最后操作的附加结果或信息。

  1. do_something(param1, param2, ..., paramN, function (err, results) { ... });

例如,

  1. fs.open(
  2. "a.js", "r",
  3. function (err, handle) {
  4. if (err) {
  5. console.log("ERROR: " + err.code + " (" + err.message ")");
  6. return;
  7. }
  8. // success!! continue working here
  9. }
  10. );

在此样式中,你检查错误或继续处理结果。

现在这里是另一种方式:

  1. fs.open(
  2. "a.hs", "r",
  3. function (err, handle) {
  4. if (err) {
  5. console.log("ERROR: " + err.code + " (" + err.message ")");
  6. } else {
  7. // success! continue working here
  8. }
  9. }
  10. );

以下代码显示如何读取带有错误处理程序的文件。

  1. var fs = require("fs");
  2. fs.open(
  3. "a.js", "r",
  4. function (err, handle) {
  5. if (err) {
  6. console.log("ERROR: " + err.code + " (" + err.message + ")");
  7. return;
  8. }
  9. var buf = new Buffer(100000);
  10. fs.read(
  11. handle, buf, 0, 100000, null, function (err, length) {
  12. if (err) {
  13. console.log("ERROR: " + err.code + " (" + err.message + ")");
  14. return;
  15. }
  16. console.log(buf.toString("utf8", 0, length));
  17. fs.close(handle, function () { /* don"t care */ });
  18. }
  19. );
  20. }
  21. );

上面的代码生成以下结果。

错误处理程序