2014-10-19 13 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

相关问题