經過js看相似C#中的回掉

  我認爲並行有兩種形式,第一種是異步,第二種是多線程,目的都是爲了實現並行,只不過異步和多線程都是手段而已 markdown

  • 第一種異步 
    異步,執行完函數或方法後,沒必要阻塞性地等待返回值或消息,只須要向系統委託一個異步過程,那麼當系統接收到消息時,系統會自動觸發委託的異步過程,從而完成一個完整的流程 
  • 第二種多線程
    多線程,因爲同步函數在請求API數據的時候,因爲網絡等緣由,不能很快的完成,所以會發生進程阻塞(直到自己函數執行完成,下面的函數纔會執行),所以,每每是新建一個進程,讓它執行這個過程,主線程管理用戶界面,不會出現UI假死的狀況

  今天先說第一種,C#中都有異步方法,以下圖中的Socket就是我去發送數據,我就無論了我繼續作我下面的其餘事情,若是我發送的數據獲得了系統的回覆,那麼會自動觸發SendCallback這個函數,咱們在js中看看怎麼理解什麼叫「系統會自動觸發委託的異步過程」這句話 
網絡

  JS DEMO多線程

 1 <script>
 2 //定義一個js類
 3 var GameControl=(function(game){
 4   game.GameAlert= function(){
 5     alert('123');
 6   }
 7   //保存分數
 8   game.saveResult= function(scroe,callback){
 9    //若是分數大於0了,調用傳遞進來的函數且給函數傳遞參數
10    if (scroe > 98) {
11             if (typeof callback === "function") {
12                 callback({ "status": true, "message": "" });
13             }
14             return;
15         }
16   }
17   return game;   
18 })(GameControl || {});
19 
20 //保存遊戲分數方法
21 var saveGameResult = function (score) {
22     var alertGameEnd = function(data)
23     {
24         if (data.status == true) {
25            alert('遊戲結束了');
26         }
27         else {
28             alert('遊戲未結束');
29         }
30     }
31     //若是分數大於0了,調用GameControl類裏面的saveResult方法去保存遊戲分數,注意第二個參數是把方法傳遞進去了
32     if (score > 0) {
33         GameControl.saveResult(score, alertGameEnd);
34     }
35 }
36 
37 //調用保存遊戲分數方法
38 saveGameResult(99);
39 </script>
  1. 首先我在js中定義了一個遊戲類叫GameControl,裏面有個叫saveResult的方法 
  2. 其次我又寫了個saveGameResult保存遊戲分數的方法,在這個方法裏我又閉包包含了一個叫作alertGameEnd的方法 
  3. 當我調用saveGameResult(99)的時候,由於99大於0會調用GameControl類裏面的saveResult的方法,又由於99大於98,會調用alertGameEnd這個方法,且給alertGameEnd方法傳遞2個參數,一個是status,一個是message以下圖所示


    跟上面的C#中的SendCallback相似,js 中先委託一個alertGameEnd方法,當知足必定條件時,就會調用alertGameEnd方法,就跟自動觸發SendCallback同樣閉包

相關文章
相關標籤/搜索