在Javascript中编写asynchronous方法(在Node.js中运行代码)

在下面的代码中,我试图理解编写asynchronousJavaScript函数的概念。 要明确我的假设:

函数logTest()被调用。 它调用asyncTest(),传入log()函数。 但是,asyncTest()不直接调用log()。 而是将其传递给事件队列,以在堆栈清除时被调用。 在for循环完成之前,堆栈不应该清除,写入20个“waiting …”。 但是,控制台输出在for循环之前先放置“async”行。 我在Node.js中运行这个代码,其中console.log是一个同步函数。 有谁知道为什么“asynchronous”行不写最后?

function asyncCall(method) { return setTimeout(method, 0); } function log(str) { console.log(str); } function logTest() { asyncCall(log("async")); for(var i = 0; i < 20; i++) { log("waiting..."); } } logTest(); 

这是因为您将log("async")而不是函数log传递给asyncCall

基本上,它执行log("async") (执行asyncCall之前,logging“asynchronous”到控制台)。 调用的结果(这是undefined因为log不会返回任何东西)被传递给asyncCall然后asynchronous调用被执行。

您可能想要将其更改为:

 asyncCall(log.bind(null, "async")) 

要么

 asyncCall(function(){ log("async"); }); 

你没有通过log("async")你调用它,并将结果传递到asyncCall()

只要你加()你(通常)调用一个函数。 正如Joseph所提到的,你可以传入log.bind(null, "async") (尽pipe我更喜欢绑定this ),或者你可以传入一个新的函数来调用log("async")

 asyncCall(function(){ log("async"); }); 

但是,要回答您的真实问题,您在“等待…”之后打印“asynchronous”的假设是错误的。 为了更好地了解事件队列,我build议你阅读这个

基本上,即使节点在技术上是单线程的,它的行为就像一个multithreading应用程序,所以它可以像一次做很多事情一样行事。