在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应用程序,所以它可以像一次做很多事情一样行事。