![](/img/trans.png)
[英]Run asynchronous commands in a webpage with node.js / electron / javascript
[英]Writing an asynchronous method in Javascript (Code run in Node.js)
在下面的代碼中,我試圖理解編寫異步JavaScript函數的概念。 要明確我的假設:
函數logTest()被調用。 它調用asyncTest(),並傳遞log()函數。 但是,asyncTest()不會直接調用log()。 而是將其傳遞到堆棧清除時要調用的事件隊列。 直到for循環完成后,才應清除堆棧,寫入20個“ waiting ...”。 但是,控制台輸出將“異步”行放在for循環之前。 我在Node.js中運行了這段代碼,其中console.log是一個同步功能。 有誰知道為什么“ async”行不是最后寫的?
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
之前將“ async”記錄到控制台)。 調用的結果(由於log
不返回任何內容,因此undefined
)傳遞給asyncCall
。 然后執行異步調用。
您可能需要將其更改為:
asyncCall(log.bind(null, "async"))
要么
asyncCall(function(){
log("async");
});
您沒有傳遞log("async")
,而是調用它並將結果傳遞給asyncCall()
一旦添加()
,(通常)便會調用一個函數。 如約瑟夫所說,您可以傳入log.bind(null, "async")
(盡管我更喜歡綁定this
),也可以傳入一個調用log("async")
的新函數,方法是:
asyncCall(function(){
log("async");
});
但是,要回答您的實際問題,您的假設是在20個“正在等待...”之后將打印“異步”,這是不正確的。 為了更好地了解事件隊列,建議您閱讀以下內容
基本上,即使從技術上講,節點是單線程的,它的行為也類似於多線程應用程序,因此它可以像同時執行許多操作一樣工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.