2014-08-28 100 views
0

下面是代碼:如何執行3個異步函數?

adjust_geo = function(callback){Plasma.Hose('edge-to-sluice').Deposit({ 
      "descrips": [ 
      "sluice", 
      "prot-spec v1.0", 
      "request", 
      "zoom" 
      ], 
      "ingests": { 
      "lat": stickie.latitude, 
      "lon": stickie.longitude, 
      "level": stickie.zoom_level 
      } 
     }); 
     Plasma.Hose('edge-to-sluice').Deposit({ 
      "descrips": [ 
      "sluice", 
      "prot-spec v1.0", 
      "request", 
      "set-time" 
      ], 
      "ingests": { 
      "time": stickie.start, 
      "rate": 2.0, 
      "pause": false 
      } 
     }); 
     callback(); 
     }   

     var remove_stickies = function(callback){  
      Plasma.Hose('edge-to-sluice').Deposit({ descrips: ['sluice', 'prot-spec v1.0', 'request', 'remove-all-fluoro'], ingests : {} 
     }); 
     callback(); 
     } 


     deposit_fluoros = function(){ 
     console.log(stickie.fluoroscopes); 
     L = JSON.parse(stickie.fluoroscopes); 
     console.log(L); 
     for (var i = 1; i<L.length;i++){ 
       console.log(L[i]);     
       Plasma.Hose('tcp://localhost/edge-to-sluice') 
         .Deposit({ 
          "descrips": [ 
          "sluice", 
          "prot-spec v1.0", 
          "request", 
          "new-fluoro-instance"], 
          "ingests":L[i] 
         }); 
       }; 
      } 
      } 
    adjust_geo(remove_stickies(deposit_fluoros())); 

,你可以在最後一行看到,我試圖以執行三個asnychronous功能。然而,現在它抱怨第34行的callback()是未定義的。 TypeError:undefined不是一個函數。它很奇怪,因爲它似乎不關心adjust_geo中的那個?

+2

承諾是要走的路。避免異步函數的回調,它會很快讓你感到困惑。 – simonzack 2014-08-28 18:41:48

+1

你在34上得到錯誤的原因是因爲callback()在remove_stickies函數外被調用。 – 2014-08-28 18:46:31

+0

'adjust_geo','remove_stickies'和'deposit_fluoros'的執行順序是什麼? – Igor 2014-08-28 19:52:44

回答

0

更改你最後一行讀

adjust_geo(remove_stickies(deposit_fluoros)); 

你正在做它現在這樣做,你是路過deposit_fluoros的結果,而不是傳遞一個參考的運作方式。

+0

這不會傳遞迴調到'adjust_geo' – Igor 2014-08-28 19:54:45

0

刪除所有其他對象,只是普通的回調。放回你的物體,它會起作用。關鍵規則無論您何時返回或調用回調,都要確保將其作爲函數返回。

var adjust_geo = function (callback) { 

    callback(); 
    console.log('adjust_geo'); 
} 
// wrap the result of first call into a function and return it 
var remove_stickies = function (callback) { 
    return function() { 
     callback() 
     console.log('remove_stickies'); 
    }; 
} 


var deposit_fluoros = function() { 
    console.log('deposit_fluoros') 
}; 

adjust_geo(remove_stickies(deposit_fluoros)); 

輸出:

"deposit_fluoros" 
"remove_stickies" 
"adjust_geo" 
+0

嗯,這不會給任何未定義的錯誤。但它似乎仍然按照remove_stickies,deposit_fluoros,adjust_geo的順序排列。也許我應該用promise來代替? – user3727514 2014-08-28 19:18:08

+0

更新了我的答案 - 如果您在有console.log語句的地方添加代碼,它將按順序排列。 – Abhi 2014-08-28 19:22:35

+0

承諾也依賴於現場後面的回調,所以它不是真正的一個。此外,沒有瀏覽器以可靠的方式本地支持承諾 – Abhi 2014-08-28 19:38:02

1

沒有您的最後一行(你必須通過回調函數,而不是讓函數調用)的問題,你必須通過回調到所有的功能,或者如果回調檢查代碼傳遞:

adjust_geo(
    function(){ 
    remove_stickies(
     deposit_fluoros 
    ) 
    }); 

這將調用adjust_geo有回調將調用remove_stickies與回調,將調用deposit_fluoros

如果Plasma.Hose('...').Deposit看起來像Plasma.Hose('...').Deposit(data, doneCallback)您可以更新您的代碼,以便通過移動下一個功能運行的功能調用轉換爲doneCallback

adjust_geo = function(callback) { 
    Plasma.Hose('edge-to-sluice').Deposit({ 
      "descrips": [ 
       "sluice", 
       "prot-spec v1.0", 
       "request", 
       "zoom" 
      ], 
      "ingests": { 
       "lat": stickie.latitude, 
       "lon": stickie.longitude, 
       "level": stickie.zoom_level 
      } 
     }, 
     function() { 
      Plasma.Hose('edge-to-sluice').Deposit({ 
       "descrips": [ 
        "sluice", 
        "prot-spec v1.0", 
        "request", 
        "set-time" 
       ], 
       "ingests": { 
        "time": stickie.start, 
        "rate": 2.0, 
        "pause": false 
       } 
      }, callback) 
     } 
    ); 
} 

var remove_stickies = function(callback) { 
    Plasma.Hose('edge-to-sluice').Deposit({ 
     descrips: ['sluice', 'prot-spec v1.0', 'request', 'remove-all-fluoro'], 
     ingests: {} 
    }, callback); 
} 


deposit_fluoros = function() { 
    console.log(stickie.fluoroscopes); 
    L = JSON.parse(stickie.fluoroscopes); 
    console.log(L); 
    for (var i = 1; i < L.length; i++) { 
     console.log(L[i]); 
     Plasma.Hose('tcp://localhost/edge-to-sluice') 
      .Deposit({ 
       "descrips": [ 
        "sluice", 
        "prot-spec v1.0", 
        "request", 
        "new-fluoro-instance" 
       ], 
       "ingests": L[i] 
      }); 
    }; 
} 
} 

adjust_geo(
    function() { 
     remove_stickies(
      deposit_fluoros 
     ) 
    }); 
+0

這對我來說很有意義,現在控制檯按正確的順序記錄adjust_geo,remove_stickies,deposit_fluoros。然而,這些功能本身似乎仍然以錯誤的順序執行。在主代碼塊(Plasma.Hose。....)完成之前,函數內部的回調是否可能執行? – user3727514 2014-08-28 23:59:40

+0

其實在這個問題中的所有功能都是**不**異步。我猜'Plasma.Hose('...')。Deposit'是異步的,在這種情況下,你必須在這個函數中傳遞'callback'。 – VitaliyG 2014-08-29 06:41:32