我试图用 Promise.all 返回一个 promise ,但由于某种原因,我的 .then 值正在计算为未定义。当它全部内联时,这似乎有效,但据我了解,我应该能够返回最上面的 promise.all,然后像对待任何其他 promise 一样对待它。
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))
首先(也是最重要的)您需要在 .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>
你会看到,有效