2015-10-07 42 views
7

我正在使用承諾庫Bluebird,我目前遇到了這個問題,即函數內的所有東西都運行良好,但是當我嘗試返回一個值時,函數改爲返回undefined承諾鏈中的返回值沒有被調用

這是承諾鏈:

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

     }); 

    }); 
} 

的問題很簡單:調用foo()時,它的價值變得undefined,而不是書。爲什麼我遇到這種行爲?

+2

富不返回所有 –

+0

東西我不熟悉的藍鳥,但我已經使用原生JS承諾。話雖如此......匿名函數'function(results)'返回書籍。上面的兩個匿名函數'function(val)'什麼也不返回。最後,'foo'不會返回任何東西。 –

+0

您需要返回所有嵌套函數。 createGroupMembers,createMessages等 – ehynds

回答

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

     }); 

    }); 
} 

現在foo將返回可解析爲本書的價值

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

說實話,foo可以改寫一個承諾,但是這是一個不同的問題完全

FYI:您可以做這樣的事情foo

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

用t他在第二個(是你唯一的)Promise.all中訂購,並在其中添加了之前的Promise結果,以使零件的最終連接像.join一樣簡單 - 以這種方式這樣做也將正確地傳播任何錯誤,因此, FOO可以

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