W moim kontrolera mam funkcję

$scope.orderHistory = {};
$scope.results = {};

var getHistory = function (max,offset)
 {
    //do some stuff
    $scope.orderHistory = data.entities;

    angular.forEach($scope.orderHistory,function(value)
    {
        $scope.results = getResults(value.id);
        console.log($scope.results);

    });

 }


 var getResults = function(id)
 {

    api.getHistoryData(id)
        .then ( function (results)
        {
            return results.data;

        });


 };

Problem, który uruchomiony jest funkcja GetResults, wydaje się, że nie wydaje się, aby faktycznie zwraca dane i ustawić go na $ Sistand.Results wewnątrz funkcji Gethistory.

Kiedy wykonuję konsolę.log w (wyniki.data) w części Czy ktoś może mi pomóc zrozumieć, dlaczego nie zwraca wyników, nawet jeśli istnieje i co mogę zrobić, aby to naprawić

2
Yeak 14 sierpień 2014, 21:53

5 odpowiedzi

Najlepsza odpowiedź

Funkcja w then(function(){...}) jest wykonywana asynchronicznie, a funkcja zawierająca getResults nie będzie czekać na zwrot. Dokładniej, api.getHistoryData wydaje się zwracać a obietnica.

Możesz użyć wiązania danych kątowych do pracy wokół tego:

var getHistory = function (max,offset)
 {
    //do some stuff
    $scope.orderHistory = data.entities;

    angular.forEach($scope.orderHistory,function(value)
    {
        getResults(value.id);    
    });

 }

var getResults = function(id)
 {   
    api.getHistoryData(id)
        .then ( function (results) {
            $scope.results = results.data;
        });
 };

A następnie w szablonie używaj czegoś takiego:

<button ng-click="getHistory(0, 0)"></button>
{{results}}
10
mb21 18 sierpień 2014, 22:05

Myślę, że nie używasz obietnicy poprawnie:

$scope.orderHistory = {};
$scope.results = {};

var getHistory = function (max,offset)
 {
    //do some stuff
    $scope.orderHistory = data.entities;

    angular.forEach($scope.orderHistory,function(value)
    {
        // get results returns a promise
        // we use the promise to set $scope.results
        getResults(value.id).then(function(results){
            $scope.results = results.data;
        });      
    });

 }

 // returns a promise
 var getResults = function(id)
 {
    return api.getHistoryData(id);
 };

$scope.results zostanie zmieniona tylko po rozwiązaniu obietnicy.

Także sposób, w jaki jest obecnie napisany, $scope.results zostanie nadpisany dla każdego value.id. Jeśli to nie jest twój zamiar, przekręcę go w tablicę i {x2}} każda nowa wartość.

1
Elad 19 sierpień 2014, 07:15

Pozwala być jasne, zmienne orderHistory i results są obiektami, a nie macierzy. Funkcja kątowa Nie oznacza to, że obiekt, który jest iterowany jest tablicą. Elad jest poprawny, stwierdzając, że zmienna wyników zostanie nadpisana dla każdej iteracji.

Jeśli chcesz zachować wszystkie wyniki z funkcji getResults, musisz instanować wyniki jako tablicę; i aby Twój pogląd odzwierciedlał wyniki, naciśnij je do zmiennej zakresu bezpośrednio z wyniku asynchronizacji.

$scope.orderHistory = {};
$scope.results = [];

var getHistory = function (max,offset)
 {
    //do some stuff
    $scope.orderHistory = data.entities;

    angular.forEach($scope.orderHistory,function(value)
    {
        getResults(value.id);
    });

 }


 var getResults = function(id)
 {
    api.getHistoryData(id)
        .then ( function (results)
        {
            $scope.results.push(results);
        });
 };
1
SKYWALKR 21 sierpień 2014, 02:33

Po prostu napraw getResults, dodaj return

var getResults = function(id)
 {
    return api.getHistoryData(id)
        .then ( function (results)
        {
            return results.data;

        });
 };
0
user854301 21 sierpień 2014, 13:14

Oto 2 punkty. Po pierwsze, Get_Results nic nie zwracają, po prostu przetwarzają łańcuch obietnic. Możemy zmienić GetResults do powrotu promienia, który powróci wynik:

var getResults = function(id)
 {
    return api.getHistoryData(id)
        .then ( function (results)
        {
            return results.data;

        });
 };

Po drugie, z wersji kątowej 1.2 (nie jest dokładnie pewien, czy z tej wersji) kątowe nie rozwiązuje się automatycznie, więc musisz to zrobić sam:

angular.forEach($scope.orderHistory,function(value)
{
    getResults(value.id).then(function(results){
       $scope.results = results;
       console.log($scope.results);
   })
});

Cały kod:

$scope.orderHistory = {};
$scope.results = {};
var getHistory = function (max,offset)
 {
    //do some stuff
    $scope.orderHistory = data.entities;
    angular.forEach($scope.orderHistory,function(value)
    {
        getResults(value.id).then(function(results){
           $scope.results = results;
           console.log($scope.results);
       })     
    });
 }
 // returns a promise
 var getResults = function(id)
 {
   return api.getHistoryData(id)
        .then ( function (results)
        {
            return results.data;
        });
 };
0
ne4istb 25 sierpień 2014, 18:34