【问题标题】:Handle updates to an array of promised objects处理对承诺对象数组的更新
【发布时间】:2017-03-07 10:24:25
【问题描述】:

在 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,它们都会显示,但在这两种情况下都不会更新值。

所以我的问题是:

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

【问题讨论】:

  • if reusing a promise after it resolved in an array is practicable - 什么是重复使用?一旦承诺得到解决,就是这样
  • “返回一个 promise,它解析为具有指定过滤器的最新测量数据的对象。可选地,该对象实时更新。” c8yMeasurements.latest 方法的说明来自 API。如果 promise 只解析一次,那么如何在没有频繁请求的情况下接收值更新?
  • 网络套接字。服务器发送事件。长轮询。这是我能想到的三种方式
  • 好的,假设长轮询是由 c8yMeasurements.latest 实现的,它就是这样做的。当 Promise 解决时,函数返回对象。如何从那里着手?

标签: javascript angularjs promise q cumulocity


【解决方案1】:

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

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

Cumulocity angular notification module documentation .请注意,在此示例中,您必须创建对 measure/myspecificchannelname 频道的订阅。

像这样:

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

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

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

【讨论】:

    猜你喜欢
    • 2017-12-14
    • 1970-01-01
    • 2019-09-30
    • 2017-01-20
    • 1970-01-01
    • 2020-11-21
    • 2018-10-12
    • 2016-09-18
    相关资源
    最近更新 更多