2016-12-12 7 views
0

Ich versuche zu versprechen, Verkettung, aber ich bekomme undefined für einen Teil in meiner Kette und ich bin mir nicht sicher warum. Das Problem scheint zu sein, wenn ich serviceFactory.GetProjectManager() verwende. Wenn ich zurückkomme, scheint es kein Versprechen zu geben, sondern geht stattdessen automatisch in den nächsten mit einem aufgelösten Wert von undefined.Versprechen Verkettung Rückkehr undefiniert

Wenn GetProjectManager eine Zeichenkette zurückgibt und ich das vom Funktionsaufruf zurückgebe, wickelt es es in einer Verheißung ein und wird an die nächste Versprechungskette weitergegeben?

dataFactory.GetProject() 
    .then(function(result){ 
     return result.Response.ProjectId; 
    }).then(function(projectId){ 
     return serviceFactory.GetProjectManager(projectId); 
    }) 
    .then(function(result){ 
     //GET UNDEFINED HERE <--------- 
    }) 
    .catch(function(error){ 

    }); 

Wenn ich den Code wie unten schreiben, dann wird es den richtigen Wert in der Callback zurück, aber ich will nicht Rückrufe verwenden ich abgeflachte Versprechen Verkettungs verwenden möchten.

dataFactory.GetProject() 
    .then(function(result){ 
     return result.Response.ProjectId; 
    }).then(function(projectId){ 
     serviceFactory.GetProjectManager(projectId 
      ,function(result){ 
       //Returns Project Manager Here <---- 
      } 
      ,function(error){ 

     }); 
    }) 
    .catch(function(error){ 

    }); 
+1

Gibt ServiceFactory.GetProjectManager ein Versprechen zurück, oder akzeptiert es nur einen Rückruf als Argument? –

+0

Es akzeptiert nur einen Rückruf, ich denke, das muss der Grund sein, warum Versprechen Verkettung nicht funktioniert? – FillyPajo

+1

Gute Schätzung @FilipJuristovski –

Antwort

1

Wie Sie in den Kommentaren darauf hingewiesen, scheint GetProjectManager einen Rückruf zu akzeptieren (und zurück undefined) eher als ein Versprechen zurück.

Sie können Ihre ursprüngliche Rückruf-basierte Funktion in eine Funktion wickeln, die ein Versprechen gibt, und dass stattdessen rufen:

function GetProjectManagerAsync (serviceFactory, projectId) { 
    return $q(function (resolve, reject) { 
     serviceFactory.GetProjectManager(projectId, resolve, reject) 
    }) 
} 

dataFactory.GetProject() 
    .then(function(result){ 
     return result.Response.ProjectId 
    }) 
    .then(function (projectId){ 
     return GetProjectManagerAsync(serviceFactory, projectId) 
    }) 
    .then(function (projectManager) { 
     // do something neat with `projectManager` 
    }) 
    .catch(function (error){ 
     throw error // or do real error handling 
    }) 

Es gibt auch große Bibliotheken, die automatisch für Sie tun dies, wie Thenify.

Edit: Dank Bergi für wies darauf hin, dass Angular.js verspricht hier mehr Sinn machen würde.

+1

Beachten Sie, dass das OP wahrscheinlich Angular Versprechungen nicht die native Implementierung verwenden wird – Bergi

Verwandte Themen