处理对承诺对象数组的更新

时间:2017-03-07 10:24:25

标签: javascript angularjs promise q cumulocity

在Angularjs中,我需要显示一个数据点列表{name:"",type:"",value:"",...我从Cumulocity云的数据库中检索。此外,我需要数据点在后端的值发生变化时进行更新。 数据点名称和类型事先是已知的,但是我必须单独检索并在后端更改后更新。

function init(){
  var promiseDatapointNameType = c8yDevices.detail(deviceId);
  promiseDatapointNameType.then(c8yBase.getResData)
  .then(createDatapointObjectStack)
  .then(getDatapointObjectValues) // Problems start here
  .then(resolvedObjectsToView);
};

我试图通过一系列承诺的对象来实现这一点,其中每个对象都是之前检索的数据点的{name和type},然后我请求每个数据点对象的最新值。从后端堆叠。

function getDatapointObjectValues(datapointStack){
  return datapointStack.map(function(dpObject){
    return getLatestMeasurement(dpObject);
  });
}

因此,我在datapointStack中的每个对象上调用函数 getLatestMeasurement ,它会向QuarkIoE数据库发出请求并返回一个promise,该promise将在解析时返回datapoint Object的最新值。此外,还设置了实时选项,用于更新实时"实时"价值变化。

// For a given filter, function returns a promise of the latest     
function getLatestMeasurement(dpObject){

  var filter = {
    device: deviceId,
    fragment: "CloudControl Parameters",
    series: dpObject.name
  };
  var realtime = true;

  return c8yMeasurements.latest(filter, realtime).then(c8yBase.getResData).then(function (responseValue) {
    var jsonPathToDp = filter.fragment + "." + filter.series + ".value";
    var latestValueDB = getObjectValue(responseValue, jsonPathToDp);
    dpObject.valueLatest = latestValueDB;
    return dpObject;
  });
};

如果承诺对象数组中的任何promise解析,我想更新视图中相应的Datapoint对象,以便显示新值。

function resolvedObjectsToView(dpStackValues){
  $q.race(dpStackValues).then(function(dpRaceObject){
    vm.device.datapointStack.push(dpRaceObject);
  });
}

我目前的状态是显示所有数据点,但是如果它们在后端发生变化,则不会更新它们的值。在这里我陷入了困境,因为我不知道在数组中解决之后重复使用诺言是否切实可行,以及如何用另一种方式完成它。 如果我使用race,列表中只显示一个数据点,如果我使用$ q.all它们都会显示,但在两种情况下都没有值更新。

所以我的问题是:

如果后端的值发生变化,我如何重用已解决的承诺对象? 如果数组中关联的承诺对象解析,如何更新视图中的对象值?

1 个答案:

答案 0 :(得分:0)

为什么不为此目的使用cumulocity实时通知?当任何类型的测量在恰当的时间发生变化时,您可以轻松获得。因此,您需要在积累中创建一个通道,您可以在其中接收所有测量值并将这些测量结果发送到您想要的通知通道。我是这样看的: 1.每次测量的通道通知

    insert into
      SendNotification
    select
      m.measurement as payload,
      "measurement/myspecificchannelname"
    from
      MeasurementCreated m;
  1. 在您的应用中为您创建的频道创建订阅,例如:
  2. Cumulocity angular notification module documentation 。请注意,在此示例中,您必须创建对measurement / myspecificchannelname通道的订阅。

    像这样:

    var channel = '/measurement/myspecificchannelname';
    function init() {
     c8yNotifications.subscribe(channel).then(onSubscription);
    }
    

    如果您有特定的测量,这将是最好的方法。但是如果你想从任何设备上进行任何测量都会很奇怪,你可以订阅一个已经在积水中创建的/测量通道。

    这只是一种方式,希望这对你有所帮助!也许如果来自这里的一些来自这里的人会更好!