Der Controller:

var activeArr = [];
var activeDate = [];
var day = (endDate - startDate) / (24 * 60 * 60 * 1000);
for (var i = 1; i < day + 1; i++) {
    activeDate.push(endDate - (24 * 60 * 60 * 1000) * i);

    var start = endDate - (24 * 60 * 60 * 1000) * i;
    var end = endDate - (24 * 60 * 60 * 1000) * (i - 1);

    statisService.getRegStatis(start, end).then(function(response) {
        console.log(response.data.data); //can get data
        activeArr.push(response.data.data)
    });
}
console.log(activeArr); //nothing in the array
console.log(activeDate); // can push data into this array

Der Service:

userServiceModule.factory('statisService', ['$http','serverUrl', function($http,serverUrl){
    return {
        getRegStatis: function(startDate,endDate){
            var url = serverUrl +"/adminDA/dbReport?startTime="+startDate+"&endTime="+endDate;
            return $http.get(url);
        }
    };
}])

Ich kann die Daten von der Servicemethode abrufen. Danach möchte ich die Daten in ein Array verschieben, aber das Array enthält nichts. Wird dies durch das Versprechen verursacht? Das ist die Konsole: Bildbeschreibung hier eingeben

2
Parker Song 7 Aug. 2015 im 11:30

3 Antworten

Beste Antwort

Das Problem ist, dass Sie das Array protokollieren, bevor das Versprechen gelöst wurde. Aktualisieren Sie Ihren Code, um den Array-Wert in Ihrem .then callback zu protokollieren, nachdem Sie das activeArr Array aktualisiert haben

var activeArr = [];
var activeDate = [];
var day = (endDate - startDate) / (24 * 60 * 60 * 1000);
for (var i = 1; i < day + 1; i++) {
    activeDate.push(endDate - (24 * 60 * 60 * 1000) * i);

    var start = endDate - (24 * 60 * 60 * 1000) * i;
    var end = endDate - (24 * 60 * 60 * 1000) * (i - 1);

    statisService.getRegStatis(start, end).then(function(response) {
        console.log(response.data.data); //can get data
        activeArr.push(response.data.data)
        console.log(activeArr); //now your array will be populated
});
}

console.log(activeDate); // can push data into this array
3
Tjaart van der Walt 7 Aug. 2015 im 08:39

Ändern Sie zuerst Ihre Fabrik:

userServiceModule.factory('statisService', ['$http','serverUrl', function($http,serverUrl){
        return {
            getRegStatis: function(startDate,endDate){
                var url = serverUrl +"/adminDA/dbReport?startTime="+startDate+"&endTime="+endDate;
                return $http.get(url).then(function(result){
                      return result.data;
              });
            }
        };
    }])

Dann in der Steuerung:

var activeArr = [];
var activeDate = [];
var day = (endDate - startDate) / (24 * 60 * 60 * 1000);
for (var i = 1; i < day + 1; i++) {
    activeDate.push(endDate - (24 * 60 * 60 * 1000) * i);

    var start = endDate - (24 * 60 * 60 * 1000) * i;
    var end = endDate - (24 * 60 * 60 * 1000) * (i - 1);

    statisService.getRegStatis(start, end).then(function(data) {
        console.log(data); //can get data
        activeArr.push(data);
        console.log(activeArr); //only now you can log activeArr because you have to wait for promise
    });
}

console.log(activeDate);

$ http gibt zwar ein Versprechen zurück, aber Sie müssen es mit .then oder .success von Ihrer Factory-Funktion zurückgeben

3
Tomislav 7 Aug. 2015 im 08:43

Ein $ http gibt Ihnen ein Versprechen zurück - nicht die Daten. Sie sollten nach dem Aufruf von $ http einen Rückruf anwenden

$http.get('address').success(function(res) {
 //var res is the data sent back from the request..
// in your case it should look like
return res;
});
1
FedeSc 7 Aug. 2015 im 08:39