Cannot understand node.js
From someone with few experience in JS, what do you recommend for learning Node.js?
I read a lot in the forum about event driven, non-blocking , async, callbacks, etc but I don't know what's that!
Where can I learn the basics in order to understand all that terms and in the future, node.js?
Thanks!
The concepts you mention (event-driven, non-blocking, async, callbacks) aren't specific to JavaScript and understanding them in a more general context is valuable. They all revolve around gracefully handling resources over which we have no control.
Imagine waiting for data from a TCP connection, waiting for the OS to delete a file, or waiting for a user to click a button. If you programmed this in a step-by-step fashion (step-by-step is synchronous ), you'd cruise along - "do step 1", "do step 2", "do step 3" - until you hit the step "wait for something to happen". At that point, your program would stop and refuse to budge until it received the data, received delete confirmation, or received the button click. In other words, the call blocks the program from proceeding. This is pretty inefficient considering there are likely other TCP connections, file operations, and UI actions that need our attention and don't depend on the item we're waiting for.
In many cases, it would be better to indicate we're interested in a resource and receive notifications outside of step-by-step instructions when the resource changes. From your list of concepts:
We can see these concepts illustrated by renaming a file with 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');
The third argument may look strange. It's an unnamed (anonymous) function that will be called when the rename is complete.
Note that since fs.rename is asynchronous, it's impossible to tell if we'll see the 'rename complete' or 'step after rename' message first. That's the downside to event-driven/asynchronous programming - if we have a complex set of interdependent tasks, we need to be extremely careful to insure dependent tasks complete before the tasks that depend on them. The fact that the order of async call completion can change can lead to very subtle bugs.
See also:
Edit per donald's request:
The best way to understand node.js is to download, build, install, and use it. You'll need:
Most tutorials focus on node.js's ability to quickly build an Http server:
Keep in mind that node.js fills a very particular niche - it's designed to build network programs. It may not be the right tool for other types of programs.
The basic concepts you need to understand to make progress with Node.js are the idea of events, event emitters, and event listeners.
In Node, most functions you can call are non-blocking. When you call fs.ReadStream(), for example, it returns a ReadableStream object. That object is an EventEmitter, so in order to do anything with the contents of the stream, you need to attach a listener to the object, which is a function that gets called when a particular event occurs.
So something like this works:
var fs=require('fs');
var stream = fs.createReadStream("/var/log/messages", { 'flags':'r' });
stream.addListener('data', function(someData) {
console.log(someData);
});
This reads all of the text from the given file, and writes it to the console. When there is data to read from the stream, your function gets called, and is passed the data from the file.
Interestingly, once there is no more data to read from the file, the script exits. Node only stays running as long as there's a valid event listener attached to an emitter, or another asynchronous callback (like a timer) is active.
«Javascript:The Good Parts»是有史以来学习语言的来龙去脉的最好的书籍之一,而不仅仅是DOM的东西。
链接地址: http://www.djcxy.com/p/52648.html上一篇: 如何调试节点js应用程序的断点和一切?
下一篇: 无法理解node.js