2016-04-08 11 views
0

So habe ich ein bisschen eine Verwechslung mit Winkel verspricht.Suchen und Rückholeinzelteil in Angular latenten Versprechen

Ich habe einen Dienst, eine Liste der Benutzer zu speichern

.service('user', ['$q','$http', function ($q, $http) { 
var services = {}; 

var _def_userLsit = $q.defer(); 

$http.get('/api/acc/getlist').then(function (data) { 
    _def_userLsit.resolve(data); 
}) 

services.getUserListQ = function() { 
    return _def_userLsit.promise; 
} 
return services; 
}]) 

, nachdem es eingespritzt wird, ich meine Liste in einem Controller wie folgt laden:

  user.getUserListQ().then(function (promise) { 
      $scope.userHelper.userList = promise.data; 
     }); 

hier kein Problem, bekam die json im $ scope, dann machen die Beobachter ihre Arbeit gut.

Hier ist die Json Format für die Frage vereinfacht:

obj 1 {id = 4, Username = "foohuman" $$ HashKey = "object: 14" } obj 2 {id = 444, Benutzername = "barhuman", $$ hashKey = "Objekt: 22"}

Aber ich möchte auch einen Benutzernamen nach ID, und ich muss das mehrmals (abhängig von der Post-Anzahl) ausführen.

Also ist meine Frage hier, wie kann ich den Namen eines Benutzers wie ein Funktionsanruf von dieser versprochenen Liste zurückgeben.

wie eine normale Funktion tun würde, wie folgt aus:

$scope.getUserById = function( id){ 
    return "foo"; 
    //some magic needed here 
} 

Wenn ich die userHelper.userList Trog nur wiederholen, es könnte leer sein, wenn es noch zu früh ausgeführt wird, so muß ich ein Versprechen, dass Trog laden , aber laden, iterieren durch, dann eine Zeichenfolge zum $ scope hinzuzufügen, ist nicht die beste Option, da sie mehrere Male laufen kann, so dass sie sich gegenseitig überschreiben kann, ziemlich unvorhersehbar, wenn ich sie in einer einzigen Variable abspeichere.

Also jede Idee, wie kann ich eine nette einfache Zeichenfolge von der ID zurückgeben, und kein Versprechen?

EDIT: Ok, so kann ich nicht wirklich eine nette Zeichenfolge zurückgeben, weil es eine Art Rückruf sein muss, aber ich kann die Daten aus dem Versprechen verarbeiten, so dass ich am Ende Benutzerdaten in ein Array wie geladen dies:

user.getUserListQ().then(function (promise) { 

      var uArr = []; 
      angular.forEach(promise.data, function (value, key) { 
       uArr[value.id] = value.userName; 
      }) 

      $scope.userHelper.uArr = uArr; 

     }); 

und in den hTML-Code kann ich kühn {{userHelper.uArr[taskData.tOwner]}} schreiben.

+1

Vermeiden Sie die [latenten Antipattern] (http://stackoverflow.com/q/23803743/ 1048572)! – Bergi

Antwort

1

Als erstes machen Sie mit der explicit construction antipattern Versprechungen, die schwieriger sind, als sie sein sollten.

.service('user', ['$q','$http', function ($q, $http) { 
    var services = {}; 

    var pUserList = $http.get('/api/acc/getlist'); 

    services.getUserListQ = function() { 
     return pUserList; 
    }; 

    return services; 
}]); 

In Bezug auf Ihre Frage:: Ihre erste Code-Snippet kann mit dieser ersetzt werden

So eine Idee, wie kann ich eine nette einfache Zeichenfolge durch die ID zurück und nicht ein Versprechen?

Dies ist die falsche Einstellung zu haben. Um einen Benutzer nach seiner ID zu bekommen, müssen Sie in Bezug auf Versprechen denken. Sie wissen nicht genau, wann die Daten fertig sein werden. Das bedeutet, dass Ihre Methode getUserId eine Zusage zurückgeben sollte.Sie können es wie folgt schreiben:

services.getUserById = function (id) { 
    return pUserList.then(function (users) { 
     return users.filter(function (user) { return user.id === id; })[0]; 
    }); 
}; 

in Ihrem Controller, können Sie es wie diese verwenden:

myService.getUserById(4).then(function (user) { 
    $scope.myUser = user; 
}); 
Verwandte Themen