2015-10-07 6 views
7

Ich benutze die Versprechen Bibliothek Bluebird und ich laufe derzeit auf das Problem, dass alles innerhalb der Funktion läuft super, aber wenn ich versuche, einen Wert, die Funktion stattdessen zurückgeben gibt undefined zurück.Rückgabewert innerhalb der Versprechenskette wird nicht aufgerufen

Das ist das Versprechen Kette:

function foo() { 
    createGroupMembers(parsedChat).then(function(val) { 
     var members = val; 

     createMessages(parsedChat, maxPages).then(function(val) { 
      var messages = val; 

      Promise.all([ createFrontCover(subject, firstdateOfMessages, lastDateOfMessages, isPreview), createStats(parsedChat), createBackCover(parsedChat)]) 
      .then(function (results) { 
       var front = results[0]; 
       var stats = results[1]; 
       var backcover = results[2]; 

       var book = head + front + stats + members + messages + backcover; 

       console.log('pages in this book: ', pages); 
       console.log(book); // logs perfect values. 

       return book; 
      }); 

     }); 

    }); 
} 

Das Problem ist einfach: Wenn foo() Aufruf, es wird Wert undefined statt Buch. Warum erlebe ich dieses Verhalten?

+2

foo nichts zurückliefert überhaupt –

+0

ich mit Drossel nicht vertraut bin, aber ich habe nativen JS Versprechen verwendet. Nachdem das gesagt wurde ... kehrt die anonyme Funktion 'function (results)' zurück. Die beiden anonymen Funktionen 'function (val)' darüber geben nichts zurück. 'foo' bringt am Ende nichts zurück. –

+0

Sie müssen alle verschachtelten Funktionen zurückgeben. createGroupMembers, createMessages etc. – ehynds

Antwort

13
function foo() { 
    return createGroupMembers(parsedChat).then(function(val) { 
     var members = val; 

     return createMessages(parsedChat, maxPages).then(function(val) { 
      var messages = val; 

      return Promise.all([createFrontCover(subject, firstdateOfMessages, lastDateOfMessages, isPreview), createStats(parsedChat), createBackCover(parsedChat)]) 
       .then(function(results) { 
        var front = results[0]; 
        var stats = results[1]; 
        var backcover = results[2]; 

        var book = head + front + stats + members + messages + backcover; 

        console.log('pages in this book: ', pages); 
        console.log(book); // logs perfect values. 

        return book; 
       }); 

     }); 

    }); 
} 

Jetzt wird foo ein Versprechen zurück, die auf den Wert des Buches lösen können

foo().then(function(book) { 
    console.log('huzzah I have book ' + book); 
}); 

ehrlich zu sein, foo neu geschrieben werden könnte, aber das ist eine ganz andere Frage

FYI: Sie könnte so etwas für foo tun

function foo() { 
    return createGroupMembers(parsedChat) 
    .then(function(members) { // members 
     return Promise.all([members, createMessages(parsedChat, maxPages)]); 
    }) 
    .then(function(members_messages) { // membersMessages 
     return Promise.all([createFrontCover(subject, firstdateOfMessages, lastDateOfMessages, isPreview), createStats(parsedChat)].concat(members_messages, [createBackCover(parsedChat)])); 
    }) 
    .then(function(results) { // front, stats, members, messages, back 
     var book = head + results.join(''); 

     console.log('pages in this book: ', pages); 
     console.log(book); // logs perfect values. 

     return book; 
    }); 
} 

Verwirrt mit t er bestellte in der Sekunde (war deine einzige) Promise.all, und fügte die vorherigen Promise-Ergebnisse hinzu, um die endgültige Verkettung von Teilen so einfach wie eine .join zu machen - so wird es auch alle Fehler richtig verbreiten, also deine Verwendung von foo kann

foo().then(function(book) { 
    console.log('huzzah I have book ' + book); 
}).catch(function(err) { 
    // handle any and all errors here 
});