亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

同步編程和異步編程(在node.js中)有什么區別?

同步編程和異步編程(在node.js中)有什么區別?

UYOU 2019-06-18 16:26:49
同步編程和異步編程(在node.js中)有什么區別?我一直在讀初學者我發現了以下兩段代碼。第一項:    var result = database.query("SELECT * FROM hugetable");     console.log("Hello World");第二項:    database.query("SELECT * FROM hugetable", function(rows) {        var result = rows;     });     console.log("Hello World");我知道他們應該做什么,他們查詢數據庫來檢索查詢的答案。然后console.log('Hello world').第一個應該是同步代碼。第二個是異步代碼。這兩件作品之間的區別對我來說非常模糊。輸出是什么?在異步編程上谷歌搜索也幫不了我。
查看完整描述

3 回答

?
臨摹微笑

TA貢獻1982條經驗 獲得超2個贊

不同之處在于第一個例子,程序將阻塞在第一行。下一行(console.log)將不得不等待。

第二個例子,console.log將在處理查詢時執行。也就是說,查詢將在后臺處理,而您的程序正在執行其他事情,一旦查詢數據準備就緒,您將對它做任何您想做的事情。

因此,簡單地說,第一個示例將阻止,而第二個示例則不會。

以下兩個示例的輸出:

// Example 1 - Synchronous (blocks)var result = database.query("SELECT * FROM hugetable");console.log("Query finished");console.log("Next line")
;// Example 2 - Asynchronous (doesn't block) database.query("SELECT * FROM hugetable", function(result) {
    console.log("Query finished");});console.log("Next line");

將是:

  1. Query finished
    Next line

  2. Next line
    Query finished


而Node本身單螺紋,有些任務可以并行運行。例如,文件系統操作發生在不同的進程中。

這就是Node可以執行異步操作的原因:一個線程正在執行文件系統操作,而主Node線程則一直在執行您的javascript代碼。在像Node這樣的事件驅動服務器中,文件系統線程通知主節點線程某些事件,如完成、失敗或進度,以及與該事件相關的任何數據(例如數據庫查詢的結果或錯誤消息),主節點線程決定如何處理該數據。

你可以在這里讀到更多關于這一點的信息:單線程非阻塞IO模型是如何在Node.js中工作的


查看完整回答
反對 回復 2019-06-18
?
呼喚遠方

TA貢獻1856條經驗 獲得超11個贊

這兩種方法的區別如下:

同步方式:它等待每個操作完成,然后只執行下一個操作。用于查詢:console.log()除非查詢已完成執行以獲得數據庫的所有結果,否則將不會執行命令。

異步方式:它從不等待每個操作完成,而是只在第一步執行所有操作。一旦結果可用,將處理每個操作的結果。用于查詢:console.log()命令之后不久將執行Database.Query()方法。數據庫查詢在后臺運行并在完成檢索數據后加載結果。

用例

  1. 如果您的操作不像查詢來自DB的巨大數據那樣需要進行非常繁重的工作,那么就繼續使用同步方式,否則采用異步方式。

  2. 在異步方式下,您可以向用戶顯示一些進度指示符,而在后臺,您可以繼續您的重量級工作。這是GUI應用程序的理想場景。


查看完整回答
反對 回復 2019-06-18
?
開滿天機

TA貢獻1786條經驗 獲得超13個贊

如果在這兩個示例中添加一行,這將變得更加清晰:

var result = database.query("SELECT * FROM hugetable");console.log(result.length);console.log("Hello World");

第二項:

database.query("SELECT * FROM hugetable", function(rows) {
   var result = rows;
   console.log(result.length);});console.log("Hello World");

嘗試運行這些程序,您將注意到第一個(同步)示例將在“HelloWorld”行之前打印出結果.Length。在第二個(異步)示例中,將(很可能)在“HelloWorld”行之后打印結果.Length(很可能)。

這是因為在第二個例子中,database.query在后臺異步運行,腳本直接使用“HelloWorld”繼續運行。這個console.log(result.length)只有在數據庫查詢完成時才執行。


查看完整回答
反對 回復 2019-06-18
  • 3 回答
  • 0 關注
  • 1092 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號