2016-12-21 6 views
0

Der folgende Code ist erfunden. Ich bin so einfach wie möglich, um die Frage zu stellen.Die Eigenschaft 'then' von undefined mit verschachtelten Funktionsaufrufen kann nicht gelesen werden

ich eine einfache Winkel eine Dienstleistung, die ein API-Aufruf und liefert Ergebnisse macht:

doWork = function(reqId) { 
    return $http.get('/api/dowork/' + reqId).then(function(response) { 
    return response.data; 
    }).catch(function(response) { 
    return $q.reject(response.data); 
    }); 
} 

mediumRequest = function() { 
    var req = 'medium';//normally do something hard to derive this value 
    return this.doWork(req); 
} 

In meinem Controller, kann ich die doWork Funktion auf den Service anrufen und eine gute Antwort wie folgt zurück:

myService.doWork('simple').then(function(response){ 
    //do something great with response 
}); 

wenn ich aber eine Zwischen Methode zur Vorverarbeitung der Anfrage aufrufen müssen, erhalte ich „Can not Eigenschaft‚und dann‘undefinierter lesen“:

myService.mediumRequest().then(function(response){ 
    //do something great with response 
}); 

Warum gibt die Funktion mediumRequest nicht das Versprechen zurück, dass doWork zu ihr zurückkehrt?

+0

Wie wäre es mit 'return this.doWork (req)' ?? –

+1

Können Sie bitte ein reproduzierbares Beispiel erstellen, das keine API-Aufrufe erfordert? –

+0

Ich habe meinen Beispielcode so bearbeitet, dass er "this.doWork (req)" enthält, so wie mein tatsächlicher Dienst codiert ist. @LeonardoChaia Dieser Code schlägt fehl. –

Antwort

1

diesen Code Versuchen Sie

var app = angular.module("myApp", []) 
.service('myService',function($http,$q){ 
    this.doWork = function(reqId) { 
    return $http.get('/api/dowork/'+ reqId).then(function(response) { 
     return response.data; 
    }).catch(function(response) { 
     return $q.reject(response.data); 
    }); 
    }; 

    this.mediumRequest = function() { 
    var req = 'medium';//normally do something hard to derive this value 
    return this.doWork(req); 
    }; 
}) 

app.controller("myCtrl", function($scope,$compile,myService) { 
    myService.doWork('simple').then(function(response){ 
    console.log('b',response) 
    }); 
    myService.mediumRequest().then(function(response){ 
    console.log('a',response) 
    }); 
}) 

Es

+0

Ich würde den unbenutzten 'catch' Code entfernen .. –

-2

in Ihrem Dienst falsch gemacht haben arbeiten Sie versuchen können, was Sie wollen $ q-Dienst:

var doWork = function(reqId) { 
    var result = $q.defer(); 
    $http.get('/api/dowork/' + reqId).then(function(response) { 
     result.resolve(response.data); 
    }).catch(function(response) { 
     result.reject(response); 
    }); 
    return result; 
}; 

this.doWork = doWork; 

this.mediumRequest = function() { 
    var req = 'medium';//normally do something hard to derive this value 
    return doWork(req); 
}; 
0

Wie bei den meisten Dinge, das Problem war ein Codierungsfehler in meinem tatsächlichen Service-Code. Der Code, den ich in dieser Frage vorgestellt habe, würde wie erwartet funktionieren. Ich schätze die paar Leute, die Vorschläge zur Identifizierung des Problems anboten. Hier war meine Frage:

Meine eigentliche „intermediate“ Funktion dieser Struktur hatte:

mediumRequest = function(options) { 
    //process first option meeting criteria 
    options.forEach(function (item) { 
     if(item.meetsCriteria) 
     { 
     var req = item.code; 
     return this.doWork(req); 
     } 
    }); 
} 

Wie Sie sehen können, ist die Rückkehr tatsächlich nur die forEach verlässt und nie wirklich aus der mediumRequest Funktion zurückgegeben wird. Daher der Fehler.

+0

so wie ich vermutet habe, war Ihr' das' auch nicht korrekt. – Alnitak

Verwandte Themen