在JavaScript中修改回调参数

时间:2016-08-19 19:35:52

标签: javascript angularjs

我正在创建一个角度跟踪事件的服务,我希望控制器对事件跟踪尽可能愚蠢。对于此服务,每个控制器都需要提供自己的事件功能副本。我目前的解决方案如下。

//tracking module
let tracked_events = ['Event1','Event2']
    .map(function(e){
    return {
      eventName:e,
      eventProperties: {}
    }
  });

let finishingTracking = (event) => {
    console.log("prentend this does something fancy...",event);
} 

let track = (eventName,fn) => {
var event = tracked_events.filter(e => e.eventName===eventName)[0];
  fn(event.eventProperties);
  //some other internal tracking function
  finishTracking(event);
}
//end tracking module

//called from a controller
track("Event 1",(event) => {
  event["User ID"] = 123;
  event["Company ID"] = 12

});
//some other controller
track("Event 2",(event) => {
    event["Manager ID"] = 345;
    event["Time Sent"] = Date.now()
}

这很有效,因为每个控制器只需提供自己的方式来修改事件对象,它就不会知道有关跟踪模块的任何其他内容。从设计角度来看,这样可以吗?我不确定是否修改了回调参数(V8优化/副作用),但我想不出另一种不会对需要进行自己的事件跟踪的每个控制器进行更多更改的方法。对此有何建议?

编辑(在重构之前)

   var eventProperties = { table: "Machines, has_rows: /*rows...*/ }
    some_service.list(data)
      .then(function (response) {
         tracking_service.track({
           eventName: 'Event 1',
           eventProperties: eventProperties
  });

AFTER

some_service.trackEvent(some_service.events.EVENT1, function (event) {
   event["Table"] = "Machines";
   event["Has Rows"] = response.data.machines.length > 0;
});

当前正在每个控制器中定义形状{eventName: "Name", eventProperties:{} }的对象。我的解决方案是从服务中定义的常量传入eventName,并且回调函数修改对象的eventProperties。每个控制器在eventProperties中都有一组不同的属性。

在第二版运行回调后,该服务执行实际的“跟踪”。我的目标是有一个函数来准备eventProperties对象,并在实际跟踪之前添加它所需的任何属性。

self.trackEvent = function (eventName, fn) {
      //var event = TRACKED_EVENTS.filter(e => e.eventName === eventName)[0];
      var event = {
        eventName: self.events[eventName],
        eventProperties: { }
      }
      fn(event.eventProperties); //this is the callback that does the prep
      self.track(event); //does the actually tracking
    }

0 个答案:

没有答案