2017-03-02 100 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,那么你不会看到你的价值观。