异步调用允许分支执行链和通过该执行链传递结果。这具有许多优点。
其中之一,该程序可以同时执行两个或更多的调用,并在结果完成时处理结果,而不一定按照他们第一次调用的顺序。
例如,如果你有一个程序等待两个事件:
var file1;
var file2;
//Let's say this takes 2 seconds
fs.readFile('bigfile1.jpg', function (err, data) {
if (err) throw err;
file1 = data;
console.log("FILE1 Done");
});
//let's say this takes 1 second.
fs.readFile('bigfile2.jpg', function (err, data) {
if (err) throw err;
file2 = data;
console.log("FILE2 Done");
});
console.log("DO SOMETHING ELSE");
在上述情况下,bigfile2.jpg
将返回第一和事情会后只需要1秒被记录。所以你的输出时间表可能是这样的:
@0:00: DO SOMETHING ELSE
@1:00: FILE2 Done
@2:00: FILE1 Done
注意上面的日志为“DO SOMETHING ELSE
”已登录的时候了。并且File2仅在1秒后执行......并在2秒钟完成File1。一切都在内完成,总共2秒尽管callBack订单是不可预知的。
而同步做它,它看起来像:
file1 = fs.readFileSync('bigfile1.jpg');
console.log("FILE1 Done");
file2 = fs.readFileSync('bigfile2.jpg');
console.log("FILE2 Done");
console.log("DO SOMETHING ELSE");
和输出可能类似于:
@2:00: FILE1 Done
@3:00: FILE2 Done
@3:00 DO SOMETHING ELSE
通知需要共3秒执行,但订单你是怎么称呼它的。
做这通常同步需要更长的时间,一切就会结束(尤其是对外部流程像文件系统读取,写入或数据库请求),因为你在等待一件事移动到下一个之前完成。有时你想要这个,但通常你不需要。虽然有时候同步编程会更容易,因为您可以按特定顺序(通常)可靠地执行操作。
异步执行文件系统方法但是,您的应用程序可以在不等待文件系统进程完成的情况下继续执行其他与文件系统无关的任务。因此,一般而言,您可以在系统等待异步操作完成时继续执行其他工作。这就是为什么您通常会使用异步方法(通常)来处理数据库查询,文件系统和通信请求的原因。他们基本上允许在等待其他(I/O和非系统)操作完成时完成其他工作。
当您进入更高级的异步方法链接时,您可以执行一些非常强大的功能,例如使用少量代码创建范围(使用闭包等)并创建响应者以应对某些事件循环。
对不起,很长的答案。有很多原因可以让你选择同步或不同步,但希望这可以帮助你决定哪种方法最适合你。
当您处于阻止呼叫中时,无法运行其他代码。你不想那样。 – SLaks
http://stackoverflow.com/questions/13858909/synchronous-vs-asynchronous-code-with-node-js – xhallix
这是为了您的方便,所以你可以选择做什么,一般你应该选择异步方法来不阻止线程。 – adeneo