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
!不要在地图内使用推送
!