承诺既有决心,也有拒绝



似乎我的诺言同时返回真和假。控制台返回"未定义",然后在它下面返回"出现问题"。数据在这些下面返回,表明它实际上并没有等待承诺。

下面是正在调用的函数:

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))
}

谢谢,我是承诺的新手,几乎尝试了所有方法。尽管有异步 axios(( 调用,但我有一个 Promise 的原因是它没有异步执行并返回未定义的数据。

.catch(reject("something went wrong"))

您需要将一个函数传递给catch

您立即调用reject并传递其返回值。


您还使用了嵌套承诺反模式。

axios返回一个承诺。无需创建另一个。


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"});

(用通用的"出了点问题"替换抛出的错误似乎没有帮助。如果没有那个接听电话,你可能会更好(

已经有了一个承诺,只要归还它。

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;
}

最新更新