[英]Promise both resolves and rejects
好像我的 Promise 同時返回真假。 控制台返回“未定義”,然后在其下方返回“出現問題”。 數據在這些下方返回,表明它實際上並沒有在 Promise 上等待。
這是 function 被調用:
module.exports = (url) => {
return new Promise((resolve, reject) => {
axios({
method: 'get',
url: url
})
.then(response => {
const html = response.data
const $ = cheerio.load(html)
const songtable = $('.chart-list__elements > li')
const topsongs = []
songtable.each(function () {
const rank = $(this).find('.chart-element__rank__number').text()
if (rank == 11) return false;
const name = $(this).find('.chart-element__information__song').text()
const artist = $(this).find('.chart-element__information__artist').text()
topsongs.push({
rank,
name,
artist
})
})
resolve()
return topsongs;
})
.catch(reject("something went wrong"))
})
}
來自來電者:
componentDidMount() {
const top_songs = topsongs('https://www.billboard.com/charts/hot-100')
.then(console.log(top_songs))
.catch(err => console.log(err))
}
謝謝,我是 Promises 的新手,並且幾乎嘗試了所有方法。 盡管有 async axios() 調用,但我有一個 Promise 的原因是它沒有異步執行並返回未定義的數據。
.catch(reject("something went wrong"))
你需要通過一個function來catch
。
您正在立即調用reject
並傳遞其返回值。
您還使用了嵌套的 promise 反模式。
axios
返回 promise。 無需創建另一個。
module.exports = (url) =>
axios({
method: "get",
url: url,
})
.then((response) => {
const html = response.data;
const $ = cheerio.load(html);
const songtable = $(".chart-list__elements > li");
const topsongs = [];
songtable.each(function () {
const rank = $(this).find(".chart-element__rank__number").text();
if (rank == 11) return false;
const name = $(this).find(".chart-element__information__song").text();
const artist = $(this)
.find(".chart-element__information__artist")
.text();
topsongs.push({
rank,
name,
artist,
});
});
return topsongs;
})
.catch(() => {throw "something went wrong"});
(用通用的“出現問題”替換拋出的錯誤似乎沒有幫助。沒有那個 catch 調用你可能會更好)
您已經有一個 promise,只需退回它。
return axios({
method: 'get',
url: url
})
.then(response => {
const html = response.data
const $ = cheerio.load(html)
const songtable = $('.chart-list__elements > li')
const topsongs = []
songtable.each(function () {
const rank = $(this).find('.chart-element__rank__number').text()
if (rank == 11) return false;
const name = $(this).find('.chart-element__information__song').text()
const artist = $(this).find('.chart-element__information__artist').text()
topsongs.push({
rank,
name,
artist
})
})
return topsongs;
})
僅僅為了“語法糖”, async/await
讓一切都更容易閱讀:
module.exports = async (url) => {
const { data } = await axios({method:'get',url});
const $ = cheerio.load(data);
...
return topsongs;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.