Ich glaube, dieser Bereich ist falsch:
.then(function(response) {
$scope.data = response.data;
var postList = [];
for (var i = 0; i < 20; i++) {
var display = {
UserName: $http.get("https://jsonplaceholder.typicode.com/users/"+$scope.data[i].userId).then(function(response){
$scope.user = response.data;
}),
Post: $scope.data[i].title
}
postList.push(display);
}
$scope.list = postList;
});
, in der Sie eine Promise object
in IhrerEigenschaft gespeichert haben und unerwartetes Ergebnis produziert haben.
zu korrigieren, die postList zuweisen, nachdem die Anforderung beendet hat:
.then(function(response) {
$scope.data = response.data;
var postList = [];
for (var i = 0; i < 20; i++) {
$http.get("https://jsonplaceholder.typicode.com/users/"+$scope.data[i].userId).then(function(response){
$scope.user = response.data;
var display = {
UserName: "",
Post: $scope.data[i].title
};
$scope.list.push(display);
});
}
$scope.list = postList;
});
begegnen Sobald Sie dies implementiert ein neues Problem:
da Sie $http.get()
in einer Schleife aufgerufen und verwendet tatsächlich die Variable i
innerhalb von der Zeit führt den Wert von i
ist bereits in seiner endgültigen Form, die i = 20 | data.length
ist, die alle Anrufe erhalten wird.
, um dieses Problem zu dem besten Weg zu überwinden ich weiß, ist, die gesamten Daten vor der Anzeige zunächst formatiert werden:
$http.get("https://jsonplaceholder.typicode.com/posts")
.then(function(response)
{
var data = response.data;
var postList = [];
// this will check if formatting is done.
var cleared = 0;
// create a function that checks if data mapping is done.
var allClear = function() {
if (postList.length == cleared)
{
// display the formatted data
$scope.list = postList;
}
};
for (var i = 0; i < data.length; i++)
{
// create a object that stores the necessary data;
var obj = {
// the ID will be needed to store name;
ID: data[i].userId,
Post: data[i].title,
UserName: ""
};
var url = "https://jsonplaceholder.typicode.com/users/" + obj.userId;
$http.get(url).then(function(response)
{
// find its entry in the array and add UserName;
postList.forEach(function (item)
{
if (item.ID == response.userId)
{
// just add the correct key, but I will assume it is `userName`
item.UserName = response.userName;
// break the loop
return item;
}
});
// increment cleared
cleared++;
// call allClear
allClear();
});
postList.push(obj);
}
}
);
auf diese Weise sind wir sicher, dass die Daten, die sie in der Ansicht vor der Anzeige abgeschlossen sind .
wie diese Lösung a loop
enthält das Ergebnis mit dem ursprünglichen Objekt abzubilden, können wir tatsächlich postList
als ein Objekt ändern, um es ein wenig schneller zu machen:
// var postList = [];
var postList = {};
// instead of pushing we will use the ID as key
// postList.push(obj);
postList[obj.ID] = obj;
und so in diesem Abschnitt:
$http.get(url).then(function(response)
{
// instead of looking for the item in .forEach
postList[response.userId].userName = response.userName;
// increment cleared
cleared++;
// call allClear
allClear();
});
hoffe das hilft.
behoben ist Wo ist Plunker Link? –