调用函数,回调定义为字符串

时间:2017-06-15 06:46:48

标签: node.js sails.js

var method = 'serviceName.MethodName'

我只想把它称为

serviceName.methodName(function(output callback){

});

是否有任何方法可以调用它。谢谢

3 个答案:

答案 0 :(得分:1)

我现在可以想到两种方法。

  1. JS eval 您可以使用javascript eval函数将任何字符串转换为如下所示的代码段。虽然eval是一种快速解决方案,但除非您没有任何其他选择,否则不应使用。

    var method ='UserService.getData'; 的eval(方法)();

  2. 工厂模式 使用以下模式获取服务

  3. 您需要以可以使用模式访问它们的方式定义服务。

    var Services = {
    // UserService and AccountsService are again objects having some callable functions.
        UserService : {getData: function(){}, getAge: function(){}},
        AccountsService : {getData: function(){}, getAge: function(){}},
    // getService is the heart of the code which will get you the required service depending on the string paramter you pass.
        getService : function(serviceName){
            var service = '';
            switch(serviceName){
                case 'User':
                    service = this.UserService;
                    break;
                case 'Accounts':
                    service = this.AccountsService;
                    break;
            }
        return service;
    }
    }
    

    您可以使用以下代码获取所需服务

    Services.getService('User')
    

答案 1 :(得分:0)

我不知道如何在不使用serviceName的情况下将该字符串的eval部分解析为对象。显然你需要非常小心。

也许:

if (method.match(/^[a-zA-Z0-9_]+\.[a-zA-Z0-9_]+$/) {
  var servicePart = eval(method.split('.')[0]);
  var methodPart = method.split('.')[1];
  servicePart[methodPart](...)
}

答案 2 :(得分:0)

您的问题中有两个不同的问题:

  1. 如何按属性名称(字符串)访问对象属性?
  2. 如何通过它的名称(字符串)访问对象?
  3. 关于第一个问题 - 使用以下表示法很容易通过字符串访问对象属性:

    const myObject = {
      myProp: 1,
    };
    
    console.log(myObject['myProp']);
    

    关于第二个问题 - 这取决于serviceName是什么: