2015-08-23 11 views
6

Próbuję załadować i przeanalizować plik, ale mam problem z wywołaniem dwóch funkcji i zwróceniem wyniku za obietnicę. Używam obietnic Bluebird. Poniższy kod działa zgodnie z oczekiwaniami:Przyrzeczenie obietnicy dodaje nowe wywołanie funkcji do łańcucha

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]); 
.... 

podzieliłem funkcję parseFile.parse na dwa sposoby, parseFile.parse i parseFile.getProp. parseFile.getProp powinien pobrać dane wyjściowe z parseFile.parse i zwrócić to, co zostało zwrócony parseFile.parse, zanim metoda zostanie podzielona. Oto moja próba użycia obu funkcji:

run = function (filePath) { 
    return 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)) 
    ).then(function (args) { 
      return runProc('run', args[0], args[1]); 
.... 

ale to nie działa. Co ja tu robię źle?

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

co nie działa? Czy otrzymujesz jakieś błędy, czy też 'args' ma nieoczekiwaną wartość? –

+0

@ChrisHunt - problem polega na tym, że getProp jest wywoływany przed funkcją parsowania, to powoduje problem ... –

+0

Czy 'parsowanie' jest synchroniczne, czy zwraca obietnicę, która rozwiązuje poprawną wartość? Czy możesz podać swój kod 'parseFile'? Po prostu robi szybki test z czymś w rodzaju 'Promise.resolve(). Then (function() {console.log (" 1 ");} then. Then then (function() {console.log (" 2 ");}) ; 'pokazuje, że pierwsza funkcja powinna być uruchomiona przed sekundą, więc nie może to być sama obietnica powodująca problem. –

Odpowiedz

1

Promise.join nie zwróci tablicę, w Twoim przypadku - args []. Promise.all zwróci tablicę.

Więc w twoim przypadku, należy albo zmienić składnię Promise.join do

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); 
    })); 

Albo użyć Promise.all

Promise.all([promise1, promise2]).then(function(args){ 
     return runProc('run', args[0], args[1]); 
    }); 
Powiązane problemy