2015-08-23 3 views
6

Ich versuche, eine Datei zu laden und zu analysieren, habe aber einige Probleme beim Aufruf von zwei Funktionen und die Rückgabe des Ergebnisses für das Versprechen. Ich benutze Bluebird-Versprechen. Der folgende Code funktioniert wie erwartet:Promise beitreten hinzufügen neue Funktionsaufruf an die Kette

run = function (filePath) { 
    return Promise.join(
     fs.readFileAsync(filePath, 'utf8') 
      .then(parseFile.parse.bind(null, 'userKey')), 
     users.getUsersAsync(usersObj) 
      .then(users.modifyRec.bind(null, process.env.users)) 
    ).then(function (args) { 
      return runProc('run', args[0], args[1]); 
.... 

ich die parseFile.parse Funktion in zwei Verfahren aufgeteilt haben, parseFile.parse und parseFile.getProp. parseFile.getProp sollte die Ausgabe von parseFile.parse nehmen und zurückgeben, was parseFile.parse zurückgegeben, bevor die Methode aufgeteilt wurde. Hier ist mein Versuch, beide Funktionen zu verwenden:

aber es funktioniert nicht. Was mache ich hier falsch?

UPDATE

var ymlParser = require('yamljs'); 
var ymlObj; 

parse = function (data) { 
    "use strict"; 
    if (!ymlObj) { 
     ymlObj = ymlParser.parse(data); 
    } 
    return ymlObj; 
}; 

getProcWeb = function() { 
    return ymlObj.prop.web; 
}; 

module.exports = { 
    parse: parse, 
    getProp: getProp 
}; 
+2

Was nicht funktioniert? Erhalten Sie irgendwelche Fehler, oder haben "Argumente" einen unerwarteten Wert? –

+0

@ChrisHunt - das Problem ist, dass die getProp vor der Parse-Funktion aufgerufen wird, dies das Problem verursachen ... –

+0

Ist synchrone "Parse", oder gibt es eine Zusage, die auf den richtigen Wert verrechnet? Können Sie Ihren 'parseFile' Code bereitstellen? Mach einfach einen Kurztest mit etwas wie 'Promise.resolve(). Dann (function() {console.log (" 1 ");}). Dann (function() {console.log (" 2 ");}) ; 'zeigt, dass die erste Funktion vor der zweiten ausgeführt werden sollte, so dass möglicherweise nicht die Promises selbst ein Problem verursachen. –

Antwort

1

Promise.join wird ein Array nicht zurück, in Ihrem Fall - args []. Promise.all wird ein Array zurückgeben.

Also in Ihrem Fall sollten Sie entweder Ihre Promise.join Syntax

Promise.join(
     fs.readFileAsync(filePath, 'utf8') 
      .then(parseFile.parse.bind(null, 'userKey')) 
      .then(parseFile.getProp.bind(null,'key')), 
     users.getUsersAsync(usersObj) 
      .then(users.modifyRec.bind(null, process.env.users)) 
     ,function(argsOne,argsTwo){ 
      return runProc('run', argsOne, argsTwo); 
    })); 

Oder verwenden Promise.all ändern

Promise.all([promise1, promise2]).then(function(args){ 
     return runProc('run', args[0], args[1]); 
    }); 
Verwandte Themen