【问题标题】:Calling function with callback defined as string调用函数,回调定义为字符串
【发布时间】:2017-06-15 06:46:47
【问题描述】:
var method = 'serviceName.MethodName'

我只想这样称呼它

serviceName.methodName(function(output callback){

});

有什么方法可以调用吗。谢谢

【问题讨论】:

    标签: node.js sails.js


    【解决方案1】:

    我现在能想到的方法有两种。

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

      var 方法 = 'UserService.getData'; 评估(方法)();

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

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

    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')
    

    【讨论】:

      【解决方案2】:

      我不知道有什么方法可以在不使用eval 的情况下将该字符串的serviceName 部分解析为对象。所以显然你需要非常小心。

      也许:

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

      【讨论】:

        【解决方案3】:

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

        1. 如何通过属性名(字符串)访问对象属性?
        2. 如何通过对象名(字符串)访问对象?

        关于第一个问题 - 使用以下符号很容易通过字符串访问对象属性:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-06-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多