为了账号安全,请及时绑定邮箱和手机立即绑定

承诺既解决又拒绝

承诺既解决又拒绝

慕侠2389804 2022-09-02 17:03:29
似乎我的应许同时回归真实和虚假。控制台返回“未定义”,然后返回“出现问题”。数据在这些下面返回,表明它实际上并没有等待承诺。下面是被调用的函数: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))  }谢谢,我是Promise的新手,并且几乎尝试了所有方法。尽管有异步 axios() 调用,但我有一个 Promise 的原因是它没有异步执行并返回未定义的数据。
查看完整描述

2 回答

?
aluckdog

TA贡献1847条经验 获得超7个赞

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

(将抛出的错误替换为通用的“出现问题”似乎没有帮助。如果没有那个接听电话,你可能会过得更好)


查看完整回答
反对 回复 2022-09-02
?
慕的地8271018

TA贡献1796条经验 获得超4个赞

你已经有了一个承诺,只是回报它。


  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;

}


查看完整回答
反对 回复 2022-09-02
  • 2 回答
  • 0 关注
  • 86 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信