簡體   English   中英

無法理解node.js

[英]Cannot understand node.js

從沒有JS經驗的人那里,你推薦什么學習Node.js?

我在論壇上閱讀了很多關於事件驅動,非阻塞,異步,回調等的內容,但我不知道那是什么!

我在哪里可以學習基礎知識,以便了解所有術語和將來node.js?

謝謝!

您提到的概念(事件驅動,非阻塞,異步,回調)並非特定於JavaScript,在更一般的上下文中理解它們是有價值的。 它們都圍繞着優雅地處理我們無法控制的資源。

想象一下,等待來自TCP連接的數據,等待操作系統刪除文件,或等待用戶點擊按鈕。 如果您按照一步一步的方式對其進行編程(逐步進行同步 ),您就可以巡航 - “執行步驟1”,“執行步驟2”,“執行步驟3” - 直到您點擊一步“等待事情發生”。 此時,您的程序將停止並拒絕讓步,直到它收到數據,收到刪除確認或收到按鈕單擊。 換句話說,該調用阻止程序繼續進行。 考慮到可能需要我們注意的其他TCP連接,文件操作和UI操作並且不依賴於我們正在等待的項目,這是非常低效的。

在許多情況下,最好表明我們對資源感興趣並在資源發生變化時接收逐步指令之外的通知。 從您的概念列表:

  • 事件是我們感興趣的資源的變化 - 我們的TCP連接收到了一些數據,文件刪除完成,或者用戶點擊了一個按鈕。
  • 異步調用告訴操作系統或運行時我們對使用資源做某事感興趣。 它們是非阻塞的 - 我們的程序可以在等待資源變化時處理其他事情。
  • 回調是資源更改時要執行的函數。 異步資源調用通常接受對回調函數的一個或多個引用(一個用於成功,一個用於錯誤等)。 當資源發生更改時,運行時會調用相應的回調。

我們可以通過使用node.js重命名文件來看到這些概念:

var fs = require('fs');

// args (current file name, new file name, callback function)
fs.rename('/tmp/hello', '/tmp/world', function (err) {
  // this occurs when the rename is complete
  if (err) throw err;
  console.log('rename complete');
});
console.log('step after rename');

第三個論點可能看起來很奇怪。 它是一個未命名( 匿名 )函數,將在重命名完成時調用。

請注意,由於fs.rename是異步的,因此無法判斷我們是否會首先看到“重命名完成”或“重命名后的步驟”消息。 這是事件驅動/異步編程的缺點 - 如果我們有一組復雜的相互依賴的任務,我們需要非常小心地確保依賴任務在依賴它們的任務之前完成。 異步調用完成的順序可以改變的事實可能導致非常微妙的錯誤。

也可以看看:


根據唐納德的要求編輯:

理解node.js的最佳方法是下載,構建,安裝和使用它。 你需要:

  • Mac OS或Linux。 如果您對Cygwin感到滿意,那也可能是一個選項,但如果您運行的是Windows,我發現在虛擬機中運行Linux會更容易。
  • Git - 不是必需的,但它使得獲取代碼庫變得容易。
  • 一種調試應用程序的方法。 看到這個問題 最初,將調試信息寫入控制台可能會起作用。 最終,您需要強大的調試功能。
  • 一個想法 - 你想用node.js做什么? 如果您對其功能概述感興趣,請瀏覽其API

大多數教程都關注node.js快速構建Http服務器的能力:

請記住,node.js填補了一個非常特殊的利基 - 它旨在構建網絡程序。 它可能不是其他類型程序的正確工具。

使用Node.js需要了解的基本概念是事件,事件發射器和事件偵聽器。

在Node中,您可以調用的大多數函數都是非阻塞的。 例如,當你調用fs.ReadStream()時,它會返回一個ReadableStream對象。 該對象是一個EventEmitter,因此為了對流的內容執行任何操作,您需要將一個偵聽器附加到該對象,該對象是在特定事件發生時被調用的函數。

所以像這樣的工作:

var fs=require('fs');
var stream = fs.createReadStream("/var/log/messages", { 'flags':'r' });
stream.addListener('data', function(someData) {
        console.log(someData);
});

這將讀取給定文件中的所有文本,並將其寫入控制台。 當有數據要從流中讀取時,將調用您的函數,並從文件中傳遞數據。

有趣的是,一旦沒有更多數據要從文件中讀取,腳本就會退出。 只要有一個有效的事件監聽器連接到發射器,或者另一個異步回調(如計時器)處於活動狀態,節點就會一直運行。

«Javascript:The Good Parts»是有史以來最好的書之一,用於學習語言的來龍去脈,而不僅僅是DOM的東西。

好吧,這個Stackoverflow問題中有很多關於它的知識,它將教你更多關於學習JS的知識。

https://stackoverflow.com/questions/3696199/how-can-i-truly-master-javascript/3696765#3696765

JavaScript基礎知識實際上與任何其他語言(hello world app等)基本相同,真正的區別在於JavaScript的“高級”領域。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM