使用发布结果

时间:2015-08-03 21:15:42

标签: javascript angularjs foreach angular-promise

我有一个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地址的位置添加另一列

2 个答案:

答案 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
                });
            });

现在我需要弄清楚如何限制大型查询的异步请求数,以免页面崩溃。