1

Ich möchte von meinem $ http.get von meinem Dienst zu meinem Controller.Verwenden Sie die Ausgabe von Diensten zu Controllern

myserviceSample.js

function messagesService($q,$http){ 
    var messages; 
    $http({ 
     method: 'GET', 
     url: 'http://api.com/feedback/list' 
    }) 
    .then(function success(response){ 

     messages = response.data; 
     console.log(messages); 
    },function error(response){ 
     console.log('error'+ response); 
    }); 
    console.log(messages); 

    return { 
     loadAllItems : function() { 
     return $q.when(messages); 
     } 
    }; 
    } 

})(); 

mycontrollerSample.js

function MessagesController(messagesService) { 
    var vm = this; 

    vm.messages = []; 

    messagesService 
     .loadAllItems() 
     .then(function(messages) { 
     console.log(messages); 
     vm.messages = [].concat(messages); 
     }); 
    } 
})(); 

Die obigen Code Ergebnisse undefiniert Ausgang gibt. Was ich vermisse?

+0

Nur ein Kommentar darüber, wie Sie den Dienst vorbereiten. Es sieht so aus, als ob Sie den Aufruf tätigen, um eine Rückmeldung/Liste abzurufen, wenn der Dienst instanziiert wird. Ich würde dies als schlecht betrachten, der Aufruf sollte erfolgen, wenn die Anfrage nach Informationen kommt, d. H. Wenn loadAllItems aufgerufen wird. Außerdem würde ich den Funktions-Wrapper aus dem Rückgabeobjekt entfernen und alle Funktionen in eine Funktion namens loadAllItems einfügen. –

Antwort

3

$q.when Objekt erwartet promise/object, damit es funktioniert. In Ihrem Fall müssen Sie promise Objekt an $q.when übergeben, wie Sie $http.get Anruf tun. Hier messages Objekt hält kein Versprechen von $http.get, so dass Sie die Implementierung der Methode wie unten ändern können.

Dienst

function messagesService($q,$http){ 
    var messages = $http({ 
     method: 'GET', 
     url: 'http://api.com/feedback/list' 
    }) 
    .then(function success(response){ 
     return response.data; 
    },function error(response){ 
     return $q.reject('Error Occured.'); 
    }); 

    return { 
     loadAllItems : function() { 
     return $q.when(messages); 
     } 
    }; 
} 

Dann wird Steuerung löst dieses Versprechen & .then den Trick

function MessagesController(messagesService) { 
    var vm = this; 
    vm.messages = []; 
    messagesService 
     .loadAllItems() 
     .then(function(messages) { 
     console.log(messages); 
     vm.messages = [].concat(messages); 
     }); 
} 

Hinweis tun:$q Verwenden ein benutzerdefiniertes Versprechen zu schaffen, gilt als schlechtes Muster, wenn Siehaben 210 Verfahren gibt (die Versprechen selbst zurückkehrt)

Verbesserte Umsetzung

function messagesService($q, $http) { 
    var messages, getList = function() { 
    return $http({ 
     method: 'GET', 
     url: 'http://api.com/feedback/list' 
    }) 
    .then(function success(response) { 
     messages = response.data 
     return response.data; 
    }, function error(response) { 
     return $q.reject('Error Occured.'); 
    }); 
    }; 

    return { 
    loadAllItems: function() { 
     if (!data) 
     return getList(); //return promise 
     else 
     return $q.resolve(messages); //return data 
    } 
    }; 
}; 
+0

Danke Pankaj, es lösen jetzt – artemist

+0

@artemist sehen aktualisierte Version des Codes .. Froh, Ihnen zu helfen .. Danke :) –

+0

ja, ich mache es in zwei mal :-) – artemist

Verwandte Themen