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ć
5 odpowiedzi
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}}
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ść.
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);
});
};
Po prostu napraw getResults
, dodaj return
var getResults = function(id)
{
return api.getHistoryData(id)
.then ( function (results)
{
return results.data;
});
};
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;
});
};