【发布时间】:2015-04-04 10:22:54
【问题描述】:
我正在尝试从 ng-repeat 输入中获取 $http 调用的响应。然后确定是否显示给定每个响应的单个 ng-repeat。目前实际的 $http api 不可用,所以我只是硬编码了响应。
不使用 Promise 就可以正常工作。但是在使用 promise 方法时,我什至无法在 jsfiddle 上运行它。 我怎样才能让承诺发挥作用?
编辑:感谢 Benjamin Gruenbaum,我修改了我的问题 我实际上并没有使用 $http 而是使用 pouchDB (本地数据库,因此无需担心 DOS)。仅以 $http 为例,因为它也返回了一个承诺。 我真正需要解决的是如何在添加新名称时再次更新承诺。例如,如果添加了“joe”,那么他应该在 'billsNotPaid'
http://jsfiddle.net/TheSlamminSalmon/cs0gxxxd/6/
查看:
<div ng-app>
<div ng-controller="MainController">
<h1>Hello Plunker!</h1>
<form ng-submit="AddNewGuy()">
<input type="text" ng-model="newGuy" placeholder="Insert New Guy"></input>
<input type="submit"></input>
</form>
<strong>Everyone</strong>
<div ng-repeat="name in names">
{{name}}
</div>
<strong>These guys haven't paid their bills (Non Promise)</strong>
<div ng-repeat="name in names">
<div ng-show="NotPaidBillsNonPromise(name)">
{{name}}
</div>
</div>
<strong>These guys haven't paid their bills (Using http Promise)</strong>
<div ng-repeat="name in billsNotPaid">
{{name}}
</div>
</div>
</div>
AngularJS 控制器:
function MainController($scope, $http) {
$scope.names = [
"James",
"Tim",
"Alex",
"Sam",
"Kim"
];
$scope.billsNotPaid = []; // start as empty
$scope.NotPaidBillsNonPromise = function (name) {
if (name == "Tim" || name == "Sam" || name == "Joe") return true;
};
$scope.NotPaidBills = function (name) {
return $http.get("http://echo.jsontest.com/name/" + name)
.then(function (r) {
return (r.data.name === "Tim" || r.data.name === "Sam" || r.data.name === "Joe")
});
};
$scope.newGuy;
$scope.AddNewGuy = function () {
$scope.names.push($scope.newGuy);
};
// start the check for each name
$scope.names.forEach(function(name){
return $scope.NotPaidBills(name).then(function(notPaid){
console.log(name, notPaid);
if(notPaid) $scope.billsNotPaid.push(name);
});
});
}
【问题讨论】:
-
NotPaidBills函数返回undefined。 -
作为一般说明 - 我强烈建议您避免对 n 个输入发出 n 个请求 - 网络流量很昂贵。
-
正如 Benjamin 所指出的,您在这里所做的确实很糟糕,但比他所说的还要糟糕...您的实现在这里,将为 N 个名称,每个摘要周期发出 N 个服务器请求, 每次 Angular 运行一个... 有大量客户端在运行,而您只是对自己实施了 DoS 攻击 o.O... (作为旁注,ng-if 通常比 ng-show/ng- 更可取隐藏)
标签: javascript angularjs promise angular-promise