这是如何异步的?

时间:2015-07-05 14:32:15

标签: javascript node.js asynchronous

我是node.js和异步JS的新手,我不确定我是否正确解释它。我试图理解这段代码:

HttpsURLConnection.setDefaultHostnameVerifier((a, b) -> true);

是异步的? 是因为我可以多次调用 countLines 函数,每次使用不同的 filedir 参数,所以它打印出文件的长度?我的意思是......那是异步的?这不仅仅是功能如何运作?

2 个答案:

答案 0 :(得分:3)

它是异步的。

它只是使用命名函数而不是匿名函数。

基于此,代码可以像这样重写:

var fs = require('fs')
var filedir = process.argv[2]

function countLines(filedir) {
    fs.readFile(filedir, "utf8", function(err, fileContents) {
        var lines = fileContents.split("\n")
        console.log(lines.length-1)
    });
}
countLines(filedir)

编辑:

要扩展@ squint的注释,在nodejs应用程序的 speed 不重要的情况下,使用readFile方法的同步变体是合理的,由于同步读取命令会导致整个程序在继续之前等待读取操作完成。

答案 1 :(得分:2)

它是异步的。但它并非异步,因为您多次调用<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>。它是异步的,因为您在以下位置执行异步函数调用:
countLines()

此功能不会阻止您的过程。它被异步调用。调用该函数后,控件不会等待函数同步完成,而是继续执行其余代码。加载文件后,将调用回调函数。在fs.readFile(filedir, "utf8", doneReading);函数调用后放置console.log("I run first"),并将非常大的文件提供给脚本。您可以看到控制台在加载文件内容之前记录我先运行。但是如果您使用countlines()同步备选,并在函数调用后放置fs.readFileSync()并记录某些内容,您将看到脚本等待直到读取整个文件,然后才记录您的日志。

异步函数通常具有以下模式:

console.log()

您可以将yourAsyncCall(arg1,arg2,...,callbackFunction); 隐式定义为匿名函数,就像在Oliver的答案中一样,或者在其他地方定义,例如您的示例。它具有callbackFunction()作为第一个参数的约定,并且来自回调的结果(如果没有错误发生)作为第二个参数。正如您在

中看到的那样
error