2017-03-02 109 views
1

我試圖用Promise.all返回一個承諾,但由於某些原因,我的.then值正在評估爲undefined。這似乎工作時,它是所有內聯,但這是我的理解,我應該能夠返回頂部promise.all,然後像對待任何其他承諾。從函數返回Promise.all

function createStreamerArray() { 
    const regularStreamers = ["ESL_SC2", "OgamingSC2", "cretetion", "freecodecamp", "storbeck", "habathcx", "RobotCaleb", "noobs2ninjas"] 
    const baseURL = 'https://wind-bow.gomix.me/twitch-api' 

    return Promise.all(
    regularStreamers.map(streamer => { 
     Promise.all([ 
     Promise.resolve($.getJSON(baseURL + '/users/' + streamer + '?callback=?', null)), 
     Promise.resolve($.getJSON(baseURL + '/streams/' + streamer + '?callback=?', null)) 
     ]).then(values => { 
     return values 
     }) 
    }) 
) 
} 

createStreamerArray().then(values => console.log(values)) 
+1

一開始,你可以刪除'。然後(值=> { 返回值 }) - 但是,這不會解決任何問題(但會使代碼更少錯誤:) –

+3

在「內部」Promise.all之前加上'return' [ - 或者刪除包裹內層''Promise.all'的'{}' –

+0

[刪除無意義的'.then(values => {}返回值]'](http://stackoverflow.com/q/ 41089122/1048572) – Bergi

回答

1

首先(也是最重要的),你需要在.map回調

這可以是這樣

regularStreamers.map(streamer => { 
    // added return 
    return Promise.all([ 
    Promise.resolve($.getJSON(baseURL + '/users/' + streamer + '?callback=?', null)), 
    Promise.resolve($.getJSON(baseURL + '/streams/' + streamer + '?callback=?', null)) 
    ]) 
}) 

或者,使用箭頭功能的縮寫形式完成的返回值,這樣

//        { removed 
regularStreamers.map(streamer => 
    Promise.all([ 
    Promise.resolve($.getJSON(baseURL + '/users/' + streamer + '?callback=?', null)), 
    Promise.resolve($.getJSON(baseURL + '/streams/' + streamer + '?callback=?', null)) 
    ]) 
) 
// } removed 

其次,(純粹以除去不需要的代碼)除去多餘的

.then(values => { 
    return values 
}) 

這導致:

function createStreamerArray() { 
 
     const regularStreamers = ["ESL_SC2", "OgamingSC2", "cretetion", "freecodecamp", "storbeck", "habathcx", "RobotCaleb", "noobs2ninjas"]; 
 
     const baseURL = 'https://wind-bow.gomix.me/twitch-api'; 
 
     
 
     return Promise.all(regularStreamers.map(streamer => Promise.all([ 
 
       Promise.resolve($.getJSON(baseURL + '/users/' + streamer + '?callback=?', null)), 
 
       Promise.resolve($.getJSON(baseURL + '/streams/' + streamer + '?callback=?', null)) 
 
     ]))); 
 
    }; 
 
    createStreamerArray().then(values => console.log(values));
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

,你會看到,工作

+0

工程很好,但冗餘代碼在那裏作爲佔位符。我實際上並不想要返回值。我想將它們組合成另一個對象並返回,但我試圖讓其餘的首先工作。 –

0

您是否嘗試在地圖功能中添加額外的回報?如果你不返回第二個Promise.all,那麼你不會看到你的價值觀。