更改承诺返回的数据

时间:2017-05-15 21:38:35

标签: javascript angularjs

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

示例:

$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变量,所以我只在对象中有这些数据,因为不包含任何不必要的信息,导致前端膨胀吗?

4 个答案:

答案 0 :(得分:1)

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

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

(我没有测试过这段代码,所以你可能需要稍微调整一下)

答案 1 :(得分:1)

您希望将map操作应用于列表。即:对于列表中的每个项目,您希望以某种方式修改列表中的每个项目。您可以使用Array.prototype.map来完成此任务。 Here is a link到MDN文档以供参考。

E.g。

$scope.information = data.Information.map(function(element) {
    return {
        id: element.id,
        name: element.name
    }
});

答案 2 :(得分:0)

的Tamas'答案是在从“服务”中提取数据后过滤数据的一个很好的例子。在我正在处理的应用程序中,从我们的服务'计算记录的某些字段有时会很昂贵,这实际上是一个带有REST API的后端服务器。我们最终做的相当于

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

然后服务或后端为我们进行过滤,发回的唯一数据正是我们所需要的。 如果你可以实现(或说服服务维护者实施)这种过滤,那么你可以考虑另一种方法。

答案 3 :(得分:0)

如果您希望过滤服务中的数据:

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的.then方法,可以创建一个新的promise,它将解析为返回数据的值。