摘要:它們的作用域只在模塊內,詳見文檔回調函數與一樣,如模塊一個大項目一定是分成一個個模塊的,一般來說,一個文件就是一個模塊。這些對象有一個函數,用于將一個或多個函數綁定到命名事件上。用于注冊監(jiān)聽器,用于觸發(fā)事件。
全局對象
類似的,在瀏覽器中有window
全局變量在所有模塊中都可使用。不需要引用等。
全局變量
如console,setTimeout,require()等
全局變量在所有模塊中都可使用。 以下變量雖然看起來像全局變量,但實際上不是(global里面沒有以下屬性)。 它們的作用域只在模塊內,詳見 文檔:
__dirname __filename exports module require()回調函數
與js一樣,如:
function callFunction(fun, name) { fun(name); } callFunction(function(name) { console.log(name + " Bye"); }, "mtt");模塊
一個大項目一定是分成一個個模塊的,一般來說,一個文件就是一個模塊。
模塊使用方法:
向外暴露的是一個對象。
我們require()的時候,接收的也是一個對象.
所以也可以這樣寫:
app.js
var stuff = require("./count"); console.log(stuff.counter(["ruby", "nodejs", "react"])); console.log(stuff.adder(3));//6.14
可以使用別的模塊里的變量(閉包)
count.js
var adder = function(a) { return `the sum of the 2 numbers is ${a+pi}`; } var pi = 3.14; module.exports = { counter: function(arr) { return "There are " + arr.length + " elements in the array"; }, adder: adder }事件
http://nodejs.cn/api/events.html
大多數 Node.js 核心 API 構建于慣用的異步事件驅動架構,其中某些類型的對象(又稱觸發(fā)器,Emitter)會觸發(fā)命名事件來調用函數(又稱監(jiān)聽器,Listener)。例如,net.Server 會在每次有新連接時觸發(fā)事件,fs.ReadStream會在打開文件時觸發(fā)事件,stream會在數據可讀時觸發(fā)事件。
所有能觸發(fā)事件的對象都是 EventEmitter 類的實例。 這些對象有一個 eventEmitter.on() 函數,用于將一個或多個函數綁定到命名事件上。 事件的命名通常是駝峰式的字符串。
當 EventEmitter 對象觸發(fā)一個事件時,所有綁定在該事件上的函數都會被同步地調用。
例子,一個簡單的 EventEmitter 實例,綁定了一個監(jiān)聽器。 eventEmitter.on() 用于注冊監(jiān)聽器,eventEmitter.emit() 用于觸發(fā)事件。
const EventEmitter = require("events"); class MyEmitter extends EventEmitter {} const myEmitter = new MyEmitter(); myEmitter.on("event", () => { console.log("觸發(fā)事件"); }); myEmitter.emit("event");
總結理解:
觸發(fā)器(Emitter)會觸發(fā)監(jiān)聽器(Listener),然后函數會被同步調用。
myEmitter.on("event", () => {});用來 綁定事件與函數(注冊監(jiān)聽器,eventEmitter.emit() 用于觸發(fā)事件
例子:net.Server 會在每次有新連接時觸發(fā)事件,fs.ReadStream會在打開文件時觸發(fā)事件,stream會在數據可讀時觸發(fā)事件。
傳參數與 this 到監(jiān)聽器http://nodejs.cn/api/events.h...
eventEmitter.emit() 方法可以傳任意數量的參數到監(jiān)聽器函數。 當監(jiān)聽器函數被調用時,this 關鍵詞會被指向監(jiān)聽器所綁定的EventEmitter 實例。
const EventEmitter = require("events"); class MyEmitter extends EventEmitter{} const myEmitter1 = new MyEmitter(); myEmitter1.on("exxx",function (a, b) { console.log(a, b, this, this===myEmitter1); }) myEmitter1.emit("exxx","我是a","我是b")
總結:
eventEmitter.emit() 從第二個參數開始,會把參數傳到監(jiān)聽器綁定的那個函數里面,作為第一個開始.
this代表調用on的那個實例
事件只處理一次當使用 eventEmitter.on() 注冊監(jiān)聽器時,監(jiān)聽器會在每次觸發(fā)命名事件時被調用。
const myEmitter = new MyEmitter(); let m = 0; myEmitter.on("event", () => { console.log(++m); }); myEmitter.emit("event"); // 打印: 1 myEmitter.emit("event"); // 打印: 2
使用 eventEmitter.once() 可以注冊最多可調用一次的監(jiān)聽器。 當事件被觸發(fā)時,監(jiān)聽器會被注銷,然后再調用。
const myEmitter = new MyEmitter(); let m = 0; myEmitter.once("event", () => { console.log(++m); }); myEmitter.emit("event"); // 打印: 1 myEmitter.emit("event"); // 不觸發(fā)
evnets是核心庫,直接require("events")
手動用代碼觸發(fā)事件。
util(實用工具)(nodejs核心工具庫)
http://nodejs.cn/api/util.htm...
var events = require("events"); var util = require("util");//nodejs工具庫 var Person = function(name) { this.name = name } util.inherits(Person, events.EventEmitter); //讓Person繼承events.EventEmitter(也可以用ES6寫法的extends關鍵字),讓他擁有可以綁定事件,觸發(fā)事件的功能。 var xiaoming = new Person("xiaoming"); var lili = new Person("lili"); var lucy = new Person("lucy"); //新生成三個對象 var person = [xiaoming, lili, lucy]; person.forEach(function(person) { person.on("speak", function(message) { console.log(person.name + " said: " + message);//給每一個新對象綁定事件 }) }) xiaoming.emit("speak", "hi");//每一個新對象都可以觸發(fā)事件 lucy.emit("speak", "I want a curry");讀寫文件(同步,異步)
文件系統:http://nodejs.cn/api/fs.html
fs 模塊用于以一種類似標準 POSIX 函數的方式與文件系統進行交互。
使用方法如下:
const fs = require("fs");
所有的文件系統操作都有同步和異步兩種形式。
異步形式的最后一個參數是完成時的回調函數。 傳給回調函數的參數取決于具體方法,但第一個參數會保留給異常。 如果操作成功完成,則第一個參數(異常)會是 null 或 undefined。
const fs = require("fs"); fs.unlink("/tmp/hello", (err) => { if (err) throw err; console.log("成功刪除 /tmp/hello"); });同步
當使用同步操作時,任何異常都會立即拋出,可以使用 try/catch 處理異常。
const fs = require("fs"); try { fs.unlinkSync("/tmp/hello"); console.log("成功刪除 /tmp/hello"); } catch (err) { // 處理異常。 }同步異步注意
異步的方法不能保證執(zhí)行順序。 所以下面的例子可能會出錯,因為 fs.stat() 可能在 fs.rename() 之前完成:
fs.rename("/tmp/hello", "/tmp/world", (err) => { if (err) throw err; console.log("重命名完成"); }); fs.stat("/tmp/world", (err, stats) => { if (err) throw err; console.log(`文件屬性: ${JSON.stringify(stats)}`); }); 要想按順序執(zhí)行操作,需要把 fs.stat() 放到 fs.rename() 的回調函數中: fs.rename("/tmp/hello", "/tmp/world", (err) => { if (err) throw err; fs.stat("/tmp/world", (err, stats) => { if (err) throw err; console.log(`文件屬性: ${JSON.stringify(stats)}`); }); });
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://systransis.cn/yun/102485.html
摘要:基礎的端到端的基準測試顯示大約比快八倍。所謂單線程,就是指一次只能完成一件任務。在服務器端,異步模式甚至是唯一的模式,因為執(zhí)行環(huán)境是單線程的,如果允許同步執(zhí)行所有請求,服務器性能會急劇下降,很快就會失去響應。 模塊 Node.js 提供了exports 和 require 兩個對象,其中 exports 是模塊公開的接口,require 用于從外部獲取一個模塊的接口,即所獲取模塊的 e...
摘要:階段是事件循環(huán)的第一階段習慣上往往都會設置數將回調函數添加到事件循環(huán)的階段的隊列中等待執(zhí)行。 后端知識點總結——NODE.JS(高級) 1.Node入門: 什么是: 針對網絡應用開發(fā)的平臺主要特征: 基于Google的JavaScript運行時引擎V8 擴展了Node標準類庫: TCP,同步或異步文件管理,HTTP 為什么使用Node: 可以在服務器端運行js: 現有前端團隊可直...
摘要:回調函數是在異步操作完成后傳播其操作結果的函數,總是用來替代同步操作的返回指令。下面的圖片顯示了中事件循環(huán)過程當異步操作完成時,執(zhí)行權就會交給這個異步操作開始的地方,即回調函數。 本系列文章為《Node.js Design Patterns Second Edition》的原文翻譯和讀書筆記,在GitHub連載更新,同步翻譯版鏈接。 歡迎關注我的專欄,之后的博文將在專欄同步: Enc...
摘要:在瀏覽器中的全局對象是對象。程序是由事件驅動執(zhí)行的單線程模型,也不例外。不斷執(zhí)行響應事件的函數,直到沒有任何響應事件的函數可以執(zhí)行,就退出了。方法此方法可以在下一次事件響應中執(zhí)行代碼。它會返回一個對象,告訴我們文件的詳細信息。 global JS在瀏覽器中的全局對象是window對象。在Node.js環(huán)境中,全局對象則叫global。我們可以用它來區(qū)分當前JavaScript的執(zhí)行環(huán)境...
摘要:簡介項目命名為就是一個服務器單純開發(fā)一個服務器的想法,變成構建網絡應用的一個基本框架發(fā)展為一個強制不共享任何資源的單線程,單進程系統。單線程弱點無法利用多核錯誤會引起整個應用退出,應用的健壯性大量計算占用導致無法繼續(xù)調用異步。 NodeJs簡介 Ryan Dahl項目命名為:web.js 就是一個Web服務器.單純開發(fā)一個Web服務器的想法,變成構建網絡應用的一個基本框架.Node發(fā)展...
閱讀 3197·2021-11-23 09:51
閱讀 1537·2021-11-22 09:34
閱讀 2846·2021-10-27 14:15
閱讀 2302·2021-10-12 10:17
閱讀 1900·2021-10-12 10:12
閱讀 963·2021-09-27 14:00
閱讀 2009·2021-09-22 15:19
閱讀 1042·2019-08-30 10:51