Angular 中的过滤和 $http 承诺
Filtering and $http promises in Angular
我在从 JSON 文件中过滤数据时遇到问题,该文件是一个包含 20 个对象的数组。
在我的工厂里我有这两个功能。
function getData() {
return $http
.get('mock.json')
.success(_handleData)
.error(_handleError);
}
function _handleData(data) {
var filteredData = _filterData(data, "name", "XYZ");
console.log('filteredData', filteredData);
return filteredData;
}
这里 console.log("filteredData") 仅显示过滤后的元素(即 20 个中的 3 个);
下一步 - 在一项服务中,我在 ng-click 上得到了这个:
var filterMe = function () {
DataFactory
.getData(_address)
.success(_handleServiceData );
}
哪里
var _handleServiceData = function (data) {
filtered = data;
};
问题是 - 为什么 _handleServiceData 中的 'data' 显示所有元素而不是之前筛选的这些元素?
编辑:here's the plunk - 结果记录在控制台中
因为 filteredData
您 return 来自 _handleData
函数的 success
未传递给您在 filterMe
函数中附加的 success
回调。那是因为您将该回调附加到同一个承诺上,因为 success
函数不会像 then
方法那样创建新的承诺。因此,要解决此问题,请像这样修改您的代码:
function getData() {
return $http
.get('mock.json')
.then(_handleData, _handleError); //use "then" instead of "success"
}
然后在filterMe
函数中:
var filterMe = function () {
DataFactory
.getData(_address)
.then(_handleServiceData );
}
因为 promises 是异步的,而且您似乎 return 将 filtered
的值传递给调用者 before it could be assigned。
你应该做的
function getData() {
return $http
.get('mock.json')
.then(_handleData); // then (for chaining), not success!
}
var filterMe = function () {
return DataFactory
// ^^^^^^ return a promise, not assign globals in async callbacks
.getData(_address)
.catch(_handleError); // I assume you want to deal with errors only in the end
}
我在从 JSON 文件中过滤数据时遇到问题,该文件是一个包含 20 个对象的数组。
在我的工厂里我有这两个功能。
function getData() {
return $http
.get('mock.json')
.success(_handleData)
.error(_handleError);
}
function _handleData(data) {
var filteredData = _filterData(data, "name", "XYZ");
console.log('filteredData', filteredData);
return filteredData;
}
这里 console.log("filteredData") 仅显示过滤后的元素(即 20 个中的 3 个);
下一步 - 在一项服务中,我在 ng-click 上得到了这个:
var filterMe = function () {
DataFactory
.getData(_address)
.success(_handleServiceData );
}
哪里
var _handleServiceData = function (data) {
filtered = data;
};
问题是 - 为什么 _handleServiceData 中的 'data' 显示所有元素而不是之前筛选的这些元素?
编辑:here's the plunk - 结果记录在控制台中
因为 filteredData
您 return 来自 _handleData
函数的 success
未传递给您在 filterMe
函数中附加的 success
回调。那是因为您将该回调附加到同一个承诺上,因为 success
函数不会像 then
方法那样创建新的承诺。因此,要解决此问题,请像这样修改您的代码:
function getData() {
return $http
.get('mock.json')
.then(_handleData, _handleError); //use "then" instead of "success"
}
然后在filterMe
函数中:
var filterMe = function () {
DataFactory
.getData(_address)
.then(_handleServiceData );
}
因为 promises 是异步的,而且您似乎 return 将 filtered
的值传递给调用者 before it could be assigned。
你应该做的
function getData() {
return $http
.get('mock.json')
.then(_handleData); // then (for chaining), not success!
}
var filterMe = function () {
return DataFactory
// ^^^^^^ return a promise, not assign globals in async callbacks
.getData(_address)
.catch(_handleError); // I assume you want to deal with errors only in the end
}