我有一个Web应用程序,它记录了IP地址,连接和断开时间,以及访问者在媒体流中传输的比特数。在表中显示此信息之前,我会检查搜索结果并在$angular.forEach()
循环中添加连接长度和每秒位数等内容。我想向数据库发出$http get
请求以获取IP地址的位置和isp信息。我尝试将get请求直接添加到forEach
循环,但我得到了TypeError: Cannot assign to read only property 'method' of "theIp"
。我用一个地址测试了我用来连接数据库的cgi文件,所以它确实有效。查询始终返回ip。
$http.post(...)
.then(function(result) {
console.log(result);
$scope.results = result.data.data;
angular.forEach($scope.results, function(conn) {
conn.connected = moment.utc(conn.connected).toDate();
conn.disconnected = moment.utc(conn.disconnected).toDate();
conn.connected = moment(conn.connected).format("YYYY-MM-DD HH:mm:ss");
conn.disconnected = moment(conn.disconnected).format("YYYY-MM-DD HH:mm:ss");
conn.secondsElapsed = moment(conn.disconnected).diff(moment(conn.connected), 'seconds');
conn.bitsPerSecond = conn.traffic / conn.secondsElapsed;
//console.log("connection is " + conn.streamName);
$http.get("thedb.cgi?action=get&addr=", conn.ip) //addr is name of ip argument
.success(function(ipLocation){
console.log(ipLocation); //just want to fetch info correctly before adding it to view
});
});
我一直在阅读有关承诺的内容,但我认为如果我正在查看一系列结果,为什么还需要做出另一个承诺?
编辑:好的,所以我尝试了一些建议的修复,现在我有一个不同的问题。我收到了来自api的回复(我忘记了反斜杠)但是传入了空的json对象。现在我的$http
请求看起来像:
$http.get("/api/thedb.cgi", {action:'get', addr:conn.ip})
.then(function(ipLocation){
console.log(ipLocation);
});
但是它会在绘制表格后很长时间内发送空白JSON对象并执行请求。根据要求,这里有关于表格相关部分的观点:
<tbody>
<tr ng-repeat="result in results>
<td style="text-align: left;">{{result.ip}}</td>
<td style="text-align: center;">{{result.connected}}</td>
<td style="text-align: center;" ng-hide="liveListenerCheck">{{result.disconnected}}</td>
<td ng-module="" style="text-align: right;" ng-hide="result.secondsElapsed < 60">{{Math.floor(result.secondsElapsed/60) | number:0}}:{{result.secondsElapsed % 60 | leadingZero}}</td>
<td style="text-align: right;" ng-show="result.secondsElapsed < 60">>1</td>
<td style="text-align: right;">{{result.bitsPerSecond | number:0}}</td>
</tr>
</tbody>
我会为ip地址的位置添加另一列
答案 0 :(得分:0)
我想这个
$http.get("thedb.cgi?action=get&addr=", conn.ip)
应该说这个
$http.get("thedb.cgi?action=get&addr=" + conn.ip)
另外,我不确定这会有效...... as per docs你应该这样做
$http.get("thedb.cgi", {action:'get', addr:conn.ip}).then(....)
另外,如果你想像这样修改$scope.results
...
angular.forEach($scope.results, function(conn) {
conn.connected = moment.utc(conn.connected).toDate();
...
它不起作用......你应该做这样的事情
...
angular.forEach($scope.results, function(conn, key, obj) {
obj[key].connected = moment.utc(conn.connected).toDate();
...
答案 1 :(得分:0)
好吧,我认为代码看起来像这样:
angular.forEach($scope.results, function(conn, key){
$http.get("thedb.cgi?action=get&addr="+conn.ip, { cache: true})
.then(function(ipLocation) {
console.log(ipLocation);
var locationResults = ipLocation.data;
conn.country = locationResults.country;
//... more assignments
});
});
现在我需要弄清楚如何限制大型查询的异步请求数,以免页面崩溃。