2014-10-19 48 views
0

我有一個nodejs項目,其中sample.js包含兩個函數 函數A依賴於函數B的回調。如何在單個js文件中定義相關函數?

// smaple.js 

    //Both function are included in the same file 

     function B (arg1 , callback){ 
      // do some async 
      async.map(arg1 , function(item, cb){ 
        var a = item.a 
        var b = a*4 
        cb(null , {'a':a,'b':b}) 
       },function(err , result){ 
       callback(err , result) 
      }) 


     } 


     function A (arg , callback){ 
      if(condition1){ 
      callback(null , 1) 
      }else{ 
      B (arg , function(err , result){ 
       if(err){ 
       callback(err , result) 
       } 
       else if (result ==1){ 

       callback (null , 2) 
       }else{ 
       callback (null , 1) 
       } 

      }) 
      } 
     } 

方案2

 // function B is in outer.js and included as module 
     //sample.js 

     var outerfunction = require('./outer.js'); 

     function A (arg , callback){ 
      if(condition1){ 
      callback(null , 1) 
      }else{ 
      outerfunction.B (arg , function(err , result){ 
       if(err){ 
       callback(err , result) 
       } 
       else if (result ==1){ 

       callback (null , 2) 
       }else{ 
       callback (null , 1) 
       } 

      }) 
      } 
     } 


     outer.js 


     function B (arg1 , callback){ 
      // do some async 
      async.map(arg1 , function(item, cb){ 
        var a = item.a 
        var b = a*4 
        cb(null , {'a':a,'b':b}) 
       },function(err , result){ 
       callback(err , result) 
      }) 


     } 

     module.exports.B = B ; 

難道方案1是使用功能的正確方法? 如果此代碼使用羣集模塊併發運行會發生什麼?

情景2是否更好地使用依賴函數? 此代碼在併發執行上表現更好嗎?

哪種情況更好?

回答

0

在JavaScript中,JavaScript文件在運行之前首先被解析,並且在解析時,所有定義爲A和B的函數都會變得已知。因此,所有頂級功能都是在任何代碼運行之前定義的。有些人將此稱爲提升,因爲範圍內的所有函數定義都被提升到範圍的頂部並在整個範圍內可用。

因此,你可以這樣做:

B(); 

function A() { 
} 

function B() { 
} 

而且,一切都會好起來的。

這個「提升」只適用於使用上述函數聲明語法定義的函數。它不是功能分配如真:

var B = function() { 
}; 

在這種情況下,var B被提升到範圍的頂部,但直到該行代碼實際執行它沒有分配的函數值,它會執行按代碼的順序排列。所以,這是行不通的:

B(); 

var A = function() { 
} 

var B = function() { 
} 

B會當您嘗試執行它尚未被分配其功能價值。


將這一信息給你的兩個方案,因爲A和B都高掛函數定義和提供的文件中的任何地方你的第一個場景shoudl工作得很好。

您的第二種情況也可以正常工作,因爲您已明確加載模塊並在調用之前獲得對B的引用。

使用集羣模塊時兩者應該沒有區別。這些文件將在啓動時加載一次,並且在您將多個請求發送到集羣模塊之前,這些文件將被加載。

+0

如果從函數C和函數D同時調用函數A,那麼在兩種情況下都會在v8堆內創建函數A的兩個實例? – 2014-10-19 09:31:53

+0

@Vicb - 在node.js的單個實例內不會創建兩個實例。解釋器只有一個函數定義。將會創建兩個表示函數執行狀態的運行時結構,但這是絕對必需的,因爲每個運行時結構都有自己的局部變量和本地狀態。現在,如果您正在啓動多個節點實例,那麼當然,所有代碼都會分別加載到node.js的每個實例中。 – jfriend00 2014-10-19 09:34:57

+0

如果C和D訪問A的兩個不同運行時,那麼如果A的任何運行時發生故障或創建錯誤,它都不會影響A的另一個運行時,那麼再感謝一個更簡單的問題。 – 2014-10-19 09:49:02

相關問題