Javascript 来自http请求的Angular2更新值

Javascript 来自http请求的Angular2更新值,javascript,angular,httprequest,Javascript,Angular,Httprequest,我有一个简单的服务,有几个get请求: getDevices() { return this.http.get('https://api.particle.io/v1/devices') .map((response: Response) => response.json()); } getVariable(deviceId: string) { return this.http.get('https://api.particle.io/v1/devices/' + de

我有一个简单的服务,有几个get请求:

getDevices() {
  return this.http.get('https://api.particle.io/v1/devices')
    .map((response: Response) => response.json());
}

getVariable(deviceId: string) {
  return this.http.get('https://api.particle.io/v1/devices/' + deviceId + '/running')
    .map((response: Response) => response.json());
}
在我的组件中,我有以下函数,用于获取设备,并将getVariable中的变量添加到此.devices中的每个设备

  getDevicesAndRunning() {
    function callback(array, data, res) {
      array.push(Object.assign(data, {"running": res.result}))
    }
    this.photonService.getDevices()
      .subscribe(
        data => {
          const myArray = [];
          for (var i=0; i<data.length; i++) {

            if (data[i].connected) {
              console.log(data, i);
              this.photonService.getVariable(data[i].id)
                .subscribe(
                  callback.bind(this, myArray, data[i])
                );
            };
          }
          this.devices = myArray;
        }
      );
  }
getDevicesAndRunning(){
函数回调(数组、数据、res){
array.push(Object.assign(数据,{“running”:res.result}))
}
this.photonService.getDevices()
.订阅(
数据=>{
常量myArray=[];

对于(var i=0;i由于您正在批量更新列表,因此在刷新过程中会将其清空。您需要保留数组并动态更改它。将删除的项拼接起来并推入新项。让排序函数完成其余工作。

我通过不使用原始的r我为一个正在生产的应用程序实现了类似的东西,效果非常好

当你得到原始列表时,把它藏到一边。创建一个副本并用它来显示

当您需要更新它时,获取新列表,复制它,现在您有了很多选项:旧与新、替换旧、新旧结合、显示增量等。有一些很好的ES6函数,不是本地的,但足够简单,可以执行联合、差异等操作,当然,lodash也可以提供这些功能


诚然,这涉及到列表的副本,但在我构建的应用程序中,我同时处理了数千个对象和至少六个列表,并且从来没有出现过任何内存问题等。如果有必要,你只需记得清理它。

这听起来是一个可接受的解决方案,但是我在将旧阵列克隆到新阵列时遇到了一些问题。这需要在getDevices subscribe函数中发生,对吗?否则在我们尝试拼接之前不会填充旧数组?出于某种原因,This.devices=This.oldDevices.slice();返回未定义,即使在填充oldDevices之后也会发生。我不会尝试拼接它,事实上我只使用拼接和切片(就地编辑)当我必须的时候(搜索/排序ALG等等)。再次,不要使用旧的,使用map、filter等从中构建新的。还要记住,angular.copy是你的朋友。EZ copies。如果你需要深度复制,你也可以这样做,对主题进行一点搜索将为你指明方向。