【发布时间】:2022-01-11 02:42:06
【问题描述】:
所以 getAstronautsData 向 API 发出请求,然后返回一系列承诺。这承诺向 Wiki API 发出请求并解析对象中的响应。然后 exampleAsyncFunc 必须等待所有的 Promise 并返回一个包含所有宇航员信息的大对象。 但是如果我使用 Promise.all 函数结束并且控制台是明确的。
function getAstronautsData() {
return new Promise((resolve, reject) => {
getData('http://api.open-notify.org/astros.json', "http", (data) => {
resolve(data) // get Astronauts list from API
})
}).then((astronautsList) => {
return astronautsList.people.map((person => // return array of promises
new Promise(resolve => {
getWikiData(person.name, (data) => { // request on Wiki API
resolve({info: data.extract, img: data.thumbnail.source})
})
})
))
})
}
async function exampleAsyncFunc (){
let promisesList = await getAstronautsData()
// next code just few variant was i try
let data = await Promise.all(promisesList)// it's not working.
console.log(data)
Promise.all(promisesList).then(data => console.log(data)) //it's not working. Function display nothing
promisesList.forEach((promise) => { //it's working but not so elegant
promise.then(data => console.log(data))
})
}
exampleAsyncFunc ()
function getWikiData(searhTerm, callback) {
getData(getUrlString(searhTerm), "https", (data) => {
const regex = new RegExp(searhTerm.replaceAll(" ", ".*"));
for (let page in data.query.pages) {
if (data.query.pages[page].title === searhTerm || regex.test(data.query.pages[page].title)) {
callback(data.query.pages[page])
return
}else{
callback(null)
}
}
})
}
【问题讨论】:
-
你没有拒绝任何东西。我想这就是为什么你什么都看不到的原因,因为他们默默地拒绝
-
函数
exampleAsyncFunc是否与您在测试用例中的完全一样。因为以该顺序同时在同一函数中同时使用let data = await Promise.all(promisesList)和promisesList.forEach((promise) => {并让forEach正常工作是没有意义的。 -
问题出在
getWikiData函数中。对于这些请求之一,数据请求可能会失败,并且由于您没有处理错误情况,因此承诺保持挂起(看起来您无法处理错误情况,因为回调似乎没有错误参数)。getData似乎也容易出现这个问题。 -
@t.niese 好的,我可以在所有可以添加的地方添加 catch。没用
标签: javascript async-await promise es6-promise