2016-04-04 82 views
2

我想了解的异步代码的conept,让我产生了以下代码:的JavaScript:异步函数

"use strict"; 
var fs = require("fs"); 
var buf = new Buffer(1024); 

console.log("Global Start"); 
console.log("+++ Async open - truncate - close: open file2 called"); 
fs.open("file2.txt", "r+", function (err, fd) { 
    console.log(" Global + 1 Start"); 
    if (err) { 
    return console.error(err); 
    } 
    console.log(" +++ Async file2 opened successfully!"); 

    // Truncate the opened file. 
    console.log(" +++ Async open - truncate - close: truncate file2 called"); 
    fs.ftruncate(fd, 10, function (err) { 
    console.log("  Global + 2 Start"); 
    if (err) { 
     console.log(err); 
    } 
    console.log("  +++ truncate file2 successfully!"); 
    console.log("  +++ Async open - truncate - close: read file2 called"); 
    fs.read(fd, buf, 0, buf.length, 0, function (err, bytes) { 
     console.log("   Global + 3 Start"); 
     if (err) { 
     console.log(err); 
     } 
     // Print only read bytes to avoid junk. 
     if (bytes > 0) { 
     console.log("   Global + 3 +++ truncate read: '" + buf.slice(0, bytes).toString() + "'"); 
     } 

     // Close the opened file. 
     console.log("   Global + 3 +++ truncate - open - close: close file2 called"); 
     fs.close(fd, function (err) { 
     console.log("    Global + 4 Start"); 
     if (err) { 
      console.log(err); 
     } 
     console.log("    Global + 4 ++++++++++++++++++++ Async open - truncate - close file2 + closed ++++++++++++++++++++"); 
     console.log("    Global + 4 End"); 
     }); 

     console.log("   Global + 3 End"); 
    }); 
    console.log("  Global + 2 End"); 
    }); 
    console.log(" Global + 1 End"); 
}); 
console.log("Global End"); 

从而创立了下面的输出。

Global Start 
+++ Async open - truncate - close: open file2 called 
Global End 
     Global + 1 Start 
     +++ Async file2 opened successfully! 
     +++ Async open - truncate - close: truncate file2 called 
     Global + 1 End 
       Global + 2 Start 
       +++ truncate file2 successfully! 
       +++ Async open - truncate - close: read file2 called 
       Global + 2 End 
         Global + 3 Start 
         Global + 3 +++ truncate read: 'This is a ' 
         Global + 3 +++ truncate - open - close: close file2 called 
         Global + 3 End 
           Global + 4 Start 
           Global + 4 ++++++++++++++++++++ Async open - truncate - close file2 + closed ++++++++++++++++++++ 
           Global + 4 End 

所以这是我做的是:


  1. 全球范围有: “全球开始”
  2. 调用具有一个回调函数fs.open fs.open时被执行已经完成了。
  3. fs.open开始工作,而不是等待结果,而是执行全局级别的下一个任务,即“全局结束”。

  4. 现在完成fs.open并调用回调函数。我们输入全球+1范围。

  5. 全球+ 1范围: “全球+ 1开始” 有一个回调函数

  6. 呼叫fs.ftruncate时fs.ftruncate完成

  7. fs.ftruncate开始工作那得到执行,当它工作时,Global + 1范围的其余代码被执行,即“Global + 1 End”。

  8. 当fs.ftruncate完成时,它的回调函数被调用。

Global + 3和Global + 4遵循相同的模式。


所以我的问题是;

是我对代码中发生的事情的描述是否正确?

在我看来像异步代码是从最外层的括号(全局范围)执行到最内层的括号(全局+4范围)。它不是从最内层到外层(像数学一样),也不是从顶层到顶层(如同步代码)。那是对的吗?

如果全局作用域上的某个函数完成并在全局作用域上的其他代码完成之前执行其回调函数,会发生什么情况。回调是否等待全局代码完成?

如果使用不同的文件执行相同的代码以处理需要不同时间处理的输出,那么输出的结果会以不同的顺序出现吗?

+1

你的描述基本上是正确的,但我建议忘记括号和天气的东西是执行最内层或最外层。你在描述中缺少的东西是** time **。异步回调仅在稍后的**时间执行**。对我而言,最好的方式就是像告诉视频(或PVR)录像机的说明一样:在“稍后”录制,然后继续当前的功能(这是为了向我展示电视上的内容) – slebetman

回答

2

你对此有很好的把握。至于你的问题:

  1. “在我看来,像异步代码是从最外支架(全球范围)执行到最内侧支架”

异步调用将执行像任何其他命令,而不是等待结果,下面的命令会被执行。下一个命令是异步回调之后的直接行,除非有某种函数调用。 “

  1. ”回调会等待全局代码结束吗?“

全局范围变量不会等待异步调用,反之亦然。代码将运行,并且稍后依赖异步调用中的变量的代码可能会或可能不会获取这些变量的更新版本。这取决于异步通话是否按时完成。

  1. “如果使用不同的文件执行相同的代码来处理需要不同时间处理的输出,输出结果会以不同的顺序出现吗?

同样,执行代码的顺序取决于异步调用的速度。代码将始终以相同的顺序读取。为了防止殴打你的异步调用,你要确保所有依赖异步调用的JS进入回调中,因为它会等待直到异步完成。

我相信我回答了您的所有问题,如果我错过了某些内容,任何人都会发表评论。