Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/379.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 更改承诺返回的数据_Javascript_Angularjs - Fatal编程技术网

Javascript 更改承诺返回的数据

Javascript 更改承诺返回的数据,javascript,angularjs,Javascript,Angularjs,我的应用程序有一个在控制器中调用的服务。此服务向下发送一个对象数组。我的控制器不需要返回的所有数据,相反,我只想获取我需要的数据。有没有办法构造要返回的对象数组,以便只包含所需的数据 例如: $scope.information = []; var loadData = function() { var promise = myService.getData(); promise.then(function(data) { $scope.information = data.I

我的应用程序有一个在控制器中调用的服务。此服务向下发送一个对象数组。我的控制器不需要返回的所有数据,相反,我只想获取我需要的数据。有没有办法构造要返回的对象数组,以便只包含所需的数据

例如:

$scope.information = [];

var loadData = function() {
  var promise = myService.getData();
  promise.then(function(data) {
    $scope.information = data.Information;
  },
  function (dataError) {
    console.log(dataError);
  )};
};
在我上面的示例中,data.Information是一个如下所示的对象数组:

{
  id: 1,
  name: 'joe',
  age: '21',
  hair: 'blue',
  height: '70',
}

在我的控制器中,我只需要“id”和“name”属性,而不需要其他属性。我不应该只检索必要的数据吗?我是否可以构造$scope变量,以便在对象中只包含这些数据,从而不包含任何不必要的信息,从而导致前端膨胀?

这应该很容易-您有许多选项可以实现这一点,这里有一个:

$scope.information = [];

var loadData = function() {
  var promise = myService.getData();
  promise.then(function(data) {
    $scope.information = data.Information.map(function(d) {
      return {
        id: d.id,
        name: d.name
      };
    });
  },
  function (dataError) {
    console.log(dataError);
  )};
};

(我还没有测试过这段代码,所以你可能需要对它进行一些调整)

这应该很容易-你有很多选择来实现这一点,这里有一个:

$scope.information = [];

var loadData = function() {
  var promise = myService.getData();
  promise.then(function(data) {
    $scope.information = data.Information.map(function(d) {
      return {
        id: d.id,
        name: d.name
      };
    });
  },
  function (dataError) {
    console.log(dataError);
  )};
};

(我尚未测试此代码,因此您可能需要对其进行一些调整)

看起来您希望对列表应用
map
操作。也就是说:对于列表中的每个项目,您希望以某种方式修改列表中的每个项目。您可以使用
Array.prototype.map
来实现这一点。请参阅MDN文档

例如


看起来您想对列表应用
映射操作。也就是说:对于列表中的每个项目,您希望以某种方式修改列表中的每个项目。您可以使用
Array.prototype.map
来实现这一点。请参阅MDN文档

例如


Tamas的应答是从“服务”获取数据后过滤数据的一个很好的例子。在我正在开发的应用程序中,有时从我们的“服务”计算一些记录字段会很昂贵,而“服务”实际上是一个带有RESTAPI的后端服务器。我们最终做了相当于

var loadData = function() {
  var promise = myService.getData({fields: "name,id"});
  promise.then(function(data) {
    $scope.information = data;
    });
  },
  function (dataError) {
    console.log(dataError);
  )};
};
然后,服务或后端为我们进行过滤,唯一发送回的数据正是我们所需要的。
如果你能实现(或说服服务维护者来实现)这种过滤,那是另一个你可以考虑的方法。

TAMAS的回答是一个很好的例子,在从“服务”中提取数据之后,过滤数据。在我正在开发的应用程序中,有时从我们的“服务”计算一些记录字段会很昂贵,而“服务”实际上是一个带有RESTAPI的后端服务器。我们最终做了相当于

var loadData = function() {
  var promise = myService.getData({fields: "name,id"});
  promise.then(function(data) {
    $scope.information = data;
    });
  },
  function (dataError) {
    console.log(dataError);
  )};
};
然后,服务或后端为我们进行过滤,唯一发送回的数据正是我们所需要的。
如果你可以实现(或说服服务维护者来实现)这种过滤,那是另一个你可以考虑的方法。如果你想过滤服务中的数据:

< P>:
app.service("myService", function("$http") {
    this.getData() = function() {
        return $http.get(url)
          .then(function(response) {
            return response.data;
        });
    };
    this.informationGet = function() {
        var promise = this.getData();
        var newPromise = promise.then(function(data) {
            var information = data.Information.map(function(d) {
                return {
                    id: d.id,
                    name: d.name
                };
            });
            return information;
        });
        return newPromise;
    };
});
用法:

  var promise = myService.informationGet();
  promise.then(function(information) {
    $scope.information = information;
  },
  function (dataError) {
    console.log(dataError);
    throw dataError;
  )};

通过将数据返回到promise的
。然后
方法,可以创建解析为返回数据值的新promise。

如果要筛选服务中的数据:

app.service("myService", function("$http") {
    this.getData() = function() {
        return $http.get(url)
          .then(function(response) {
            return response.data;
        });
    };
    this.informationGet = function() {
        var promise = this.getData();
        var newPromise = promise.then(function(data) {
            var information = data.Information.map(function(d) {
                return {
                    id: d.id,
                    name: d.name
                };
            });
            return information;
        });
        return newPromise;
    };
});
用法:

  var promise = myService.informationGet();
  promise.then(function(information) {
    $scope.information = information;
  },
  function (dataError) {
    console.log(dataError);
    throw dataError;
  )};

通过将数据返回到promise的
。然后
方法,可以创建一个新的promise,该promise解析为返回数据的值。

我看不出前端会因为控制器中有太多数据而变得臃肿?@Bergi-如果这个对象列表变得很长,那不是下载了很多不需要的额外数据吗?我的想法是只检索必要的数据,以使前端尽可能轻。我将角度控制器包括为“前端”。此逻辑是否不正确或有价值?如果要阻止数据下载,需要更改
myService.getData
和/或服务器端代码。向我们展示一下。我不认为前端会因为控制器中有太多数据而变得臃肿?@Bergi-如果这个对象列表变得很长,那不是下载了很多不需要的额外数据吗?我的想法是只检索必要的数据,以使前端尽可能轻。我将角度控制器包括为“前端”。此逻辑是否不正确或有价值?如果要阻止数据下载,需要更改
myService.getData
和/或服务器端代码。让我们看看。不要在
map
内使用
push
!不要在
地图
内使用
推送