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