2016-05-05 5 views
0

Ich bin ein Github Commit History Flow Visualizer in Angular mit einem Knoten-Backend Umgang mit Webhooks und Sockets implementieren. Ich verwende das Knotenpaket deferred, um Versprechungen zu verarbeiten, und ich habe Probleme mit der Zuweisung komplexer Variablen in meinen Funktionsrückrufen. Ich liebe Versprechungen, aber diese stempelt mich. Sehen Sie meinen Code unten:Knoten Objektzuweisung in asynchrone Callback-Funktion hängen unbegrenzt

function getGithubRepoData(repoName) { 
    var d = deferred(); 

    var reponseData = { 
     branches: { values: [] }, 
     tags: { values: [] }, 
     commits: [{ values: [] }] 
    } 

    deferred(getGithubRepoBranches(repoName), getGithubRepoTags(repoName))(function(result) { 
     console.log("both done"); 
     console.log(result[0]); 
     console.log("blocking?"); 
     responseData.branches.values = result[0]; 
     console.log("past here?"); 
     responseData.tags.values = result[1]; 
     console.log("now do commits"); 
     getGithubRepoCommits(repoName, result[0]).then(function(result) { 
      responseData.commits[0].values = result; 
      d.resolve(responseData); 
     }) 
    }) 
    return d.promise(); 
} 

Diese Funktion ist eindeutig die Zweige zu bekommen bedeutet, Tags und verpflichtet (für alle Filialen). Das Problem liegt darin, wenn ich versuche, responseData.branches.values zuzuweisen. Der Code korrekt ausgeführt, bis dann und gerade hängt, die Ausgabe der folgenden:

both done 
4 
blocking? 

Und dann nichts ...

Hier ist ein einfacher Proof of Concept Sie ausführen können, mein Problem zu veranschaulichen:

var deferred = require('deferred'); 

function dtest() { 
    var d = deferred(); 
    setTimeout(function() { 
     d.resolve("good"); 
    }, 500); 
    return d.promise; 
} 

var reponseData = { 
    branches: { values: [] }, 
    tags: { values: [] }, 
    commits: [{ values: [] }] 
} 
var tester = "test"; 
deferred(dtest())(function(result) { 
    tester = result; 
    console.log(result); 
    console.log("here?"); 
    responseData.branches.values = result; 
    console.log("here?"); 
    console.log(responseData.branches.values); 
}) 

Welche Ausgänge:

good 
here? 

Wie Sie, die einfache String-variablen zugewiesen Witz ist sehen h kein Problem, aber das komplexere Objekt hängt unbegrenzt.

An diesem Punkt ist mein Verdacht, dass das Paket, das ich verwende, einen Fehler hat, den ich nicht sehe, aber ich hoffe, dass jemand mit mehr Node-Wissen als ich hereinstolpern und darauf hinweisen kann, wo ich verliebe ein Sperrproblem oder eine Race Condition. Wenn das nicht funktioniert, muss ich versuchen, jede get-Funktion in Reihenfolge statt parallel auszuführen. Vielen Dank im Voraus für die Hilfe!

+0

In Ihrem eigenständigen Beispiel lösen Sie immer "gut" - dieses Versprechen schluckt wahrscheinlich den Fehler, wenn responseData.branches.values ​​nicht definiert ist. Edit: Bitte beachten Sie die "Endkette" Abschnitt für Fehler fangen/Handhabung. https://github.com/medikoo/deferred/blob/master/README.md –

+0

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

Antwort

1

In Ihrem ersten Codestück haben Sie responseData falsch geschrieben "reponseData". reponseData war später undefiniert. Sie fangen den Fehler, der von dem verzögerten Versprechen ausgelöst wird, nicht ab, so scheint es zu hängen.

+0

Niemals zuvor bin ich so weit gegangen, um einen Tippfehler zu entdecken. Gute Trauer. Danke, Mann. – nashter