请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

关于语音查豆瓣电影问题

课程接近完结了,在大部分功能都正常之外,语音查电影或者文字查电影,只要数据库里面有的,是可以查到。如果是数据库没有的,并没有进入保存电影这个步骤,我贴下代码:

exports.searchByDouban = async (q) => {

  var options = {

    url: 'https://api.douban.com/v2/movie/search?q='

  }


  options.url += encodeURIComponent(q)

  console.log(q)

  var response = await request(options)

  var data = JSON.parse(response.body)

  var subjects = []

  var movies = []

  if (data && data.subjects) {

    subjects = data.subjects

  }

  if (subjects.length > 0) {

    var queryArray = []

    subjects.forEach(item => {

      console.log(item)

      queryArray.push(async () => {

        var movie = await Movie.findOne({doubanId: item.id})

        if (movie) {

          movies.push(movie)

        }

        else {

          var directors = item.directors || []

          var director = directors[0] || {}

          movie = new Movie({

            director: director.name || '',

            title: item.title,

            doubanId: item.id,

            poster: item.images.large,

            year: item.year,

            genres: item.genres || []

          })


          movie = await movie.save()

          movies.push(movie)

        }

      })


    })

    await queryArray

    movies.forEach(movie => {

      updateMovies(movie)

    })

  }


  return movies

}

上面的subjects打印出来是有值的,但是queryArray.push(async () => {})这个方法体压根没执行啊,里面不管打印什么都没有,导致movies是个空数组,在movie模型里面也添加了相关的字段了。确实不知道问题出在哪里?求老师尽快解答下,让项目早日收尾。

正在回答

1回答

这样改写下试试:



var queryArray = []
    subjects.forEach(item => {
      console.log(item)
      queryArray.push(async () => {
        var movie = await Movie.findOne({doubanId: item.id})
        if (movie) {
          movies.push(movie)
        }
        else {
          var directors = item.directors || []
          var director = directors[0] || {}
          movie = new Movie({
            director: director.name || '',
            title: item.title,
            doubanId: item.id,
            poster: item.images.large,
            year: item.year,
            genres: item.genres || []
          })
          movie = await movie.save()
          movies.push(movie)
        }
      })
    })
    await queryArray


改成:

await Promise.all(subjects.map(async item => {
  var movie = await Movie.findOne({doubanId: item.id})
  if (movie) {
    movies.push(movie)
  }
  else {
    var directors = item.directors || []
    var director = directors[0] || {}
    movie = new Movie({
      director: director.name || '',
      title: item.title,
      doubanId: item.id,
      poster: item.images.large,
      year: item.year,
      genres: item.genres || []
    })
    movie = await movie.save()
    movies.push(movie)
  }
}))


0 回复 有任何疑惑可以回复我~
  • 提问者 vincents #1
    老师,按照您的写法可以出来了,语音查电影可以查到了,但是控制台好像报了一些错误,我不大懂这错误哪里造成的,您能帮忙看一下吗?
    报错信息:
    (node:11586) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): SyntaxError: Unexpected token o in JSON at position 1
    (node:11586) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
    回复 有任何疑惑可以回复我~ 2017-12-09 12:09:08
  • 提问者 vincents #2
    非常感谢!
    回复 有任何疑惑可以回复我~ 2017-12-09 13:35:14
  • Scott 回复 提问者 vincents #3
    把整个 await Promise.all( 外面用 try catch 包裹一下,捕获下异常
    回复 有任何疑惑可以回复我~ 2017-12-10 08:14:09
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信