Node.js 異步編程

2018-01-13 15:07 更新

下面的代碼顯示了Node.js如何處理非阻塞的異步模型。

setTimeout()函數(shù)接受調(diào)用一個(gè)函數(shù),并在超時(shí)之后應(yīng)該調(diào)用它:

setTimeout(function () {
    console.log("done");
}, 2000);

console.log("waiting");

如果運(yùn)行上述代碼,你將看到以下輸出:

setTimeout()函數(shù)結(jié)果

程序?qū)⒊瑫r(shí)設(shè)置為2000ms(2s),然后繼續(xù)執(zhí)行,打印出“waiting"文本。

在Node.js中,調(diào)用一個(gè)函數(shù)需要等待一些外部資源,我們應(yīng)該調(diào)用fopen(path,mode,function callback(file_handle){...}),而不是調(diào)用fopen(path,mode)和waiting。

例子

下面的代碼為異步函數(shù)。

var fs = require("fs");
/*www.o2fo.com*/
fs.open(
     "a.js", "r",
      function  (err, handle) {
         var buf = new Buffer(100000);
         fs.read(
             handle, buf, 0, 100000, null,
              function  (err, length) {
                 console.log(buf.toString("utf8", 0, length));
                 fs.close(handle, function () { /* don"t care */ });
             }
         );
     }
);

上面的代碼生成以下結(jié)果。

異步函數(shù)結(jié)果

注意

require函數(shù)是一種在Node.js程序中包含附加功能的方法。

回調(diào)異步函數(shù)有至少一個(gè)參數(shù),最后操作的成功或失敗狀態(tài)。它通常具有第二參數(shù),其具有來自最后操作的附加結(jié)果或信息。

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

例如,

fs.open(//www.o2fo.com
     "a.js", "r",
     function (err, handle) {
          if (err) {
              console.log("ERROR: " + err.code + " (" + err.message ")");
              return;
          }
         // success!! continue working here
     }
);

在此樣式中,你檢查錯(cuò)誤或繼續(xù)處理結(jié)果。 

現(xiàn)在這里是另一種方式:

fs.open(//www.o2fo.com
     "a.hs", "r",
     function (err, handle) {
          if (err) {
              console.log("ERROR: " + err.code + " (" + err.message ")");
          } else {
             // success! continue working here
          }
      }
);

以下代碼顯示如何讀取帶有錯(cuò)誤處理程序的文件。

var fs = require("fs");
//www.o2fo.com
fs.open(
    "a.js", "r",
     function  (err, handle) {
        if (err) {
            console.log("ERROR: " + err.code + " (" + err.message + ")");
            return;
        }
        var buf = new Buffer(100000);
        fs.read(
            handle, buf, 0, 100000, null, function  (err, length) {
                if (err) {
                    console.log("ERROR: " + err.code + " (" + err.message + ")");
                    return;
                }
                console.log(buf.toString("utf8", 0, length));
                fs.close(handle, function () { /* don"t care */ });
            }
        );
    }
);

上面的代碼生成以下結(jié)果。

錯(cuò)誤處理程序
以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)