猿问

承诺既解决又拒绝

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


下面是被调用的函数:


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 的原因是它没有异步执行并返回未定义的数据。


慕侠2389804
浏览 87回答 2
2回答

aluckdog

.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"});(将抛出的错误替换为通用的“出现问题”似乎没有帮助。如果没有那个接听电话,你可能会过得更好)

慕的地8271018

你已经有了一个承诺,只是回报它。  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/awaitmodule.exports = async (url) => {   const { data } = await axios({method:'get',url});   const $ = cheerio.load(data);   ...   return topsongs;}
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答