0

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

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

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

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

因此,我对 datapointStack 中的每个对象调用函数getLatestMeasurement ,该函数向 Cumulocity 数据库发出请求并返回一个 promise,该 promise 在解析时返回数据点对象的最新值。此外,还设置了实时选项,它在值更改时“实时”更新这个承诺值。

// 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;
  });
};

如果承诺对象数组中的任何承诺得到解决,我想更新视图中相应的数据点对象,以便显示新值。

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

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

所以我的问题是:

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

4

1 回答 1

0

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

    insert into
      SendNotification
    select
      m.measurement as payload,
      "measurement/myspecificchannelname"
    from
      MeasurementCreated m;
  1. 在您的应用中为您创建的频道创建订阅,例如:

Cumulocity 角度通知模块文档 。请注意,在此示例中,您必须创建对 measure/myspecificchannelname 频道的订阅。

像这样:

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

如果您有特定的测量值,这将是最好的方法。但是,如果您想从任何设备进行任何奇怪的测量,您可以订阅一个已经在 cumulocity 中创建的 /measurement 频道。

这只是一种方法,希望对您有所帮助!也许如果有来自积液的人出现在这里会更好!

于 2017-03-07T17:23:06.907 回答