Javascript Bluebird Promise.all回调错误

Javascript Bluebird Promise.all回调错误,javascript,promise,bluebird,Javascript,Promise,Bluebird,我正在尝试使用Promise.all()处理数组,但我不能,代码如下: 此函数用于请求imdb中的信息 module.exports = { info: function(name, fn){ var MovieDB = require("moviedb")("470fd2ec8853e25d2f8d86f685d2270e"), path = require("path"); var rex = /([a-z]*\b(?:m2ts|mp3|sub|spanish|engl

我正在尝试使用Promise.all()处理数组,但我不能,代码如下:

此函数用于请求imdb中的信息

module.exports = {

info: function(name, fn){

  var MovieDB = require("moviedb")("470fd2ec8853e25d2f8d86f685d2270e"),
    path = require("path");

  var rex = /([a-z]*\b(?:m2ts|mp3|sub|spanish|english|french|brrip|gaz|yify|avi|mp4|mkv|bdrip|dvdrip|dvdscr|dvdscreener|screener|dvdrip|r5|telesync|480p|480i|576p|576i|720p|720i|1080p|1080i|hrhd|hrhdtv|hddvd|bluray|x264|h264|xvid|ac3|dts|aac))/ig
  name = path.basename(name)
  name = name.replace(rex, "");

  var regexNameYear = /(.+?)\W?(\d{4})[^1080|720]/ig;
  var tvShowPattern = /(s[0-9][0-9])|(se[0-9][0-9])|(season\.[0-9])|(season [0-9])|(season[0-9])|(season [0-9][0-9])|([0-9]x)/ig;
  var year = /(\d{4})/g

  var hasYear;
  var yearFile;

  if(name.match(/\d{4}/g)){
    yearFile = name.match(/\d{4}/g);
    yearFile = yearFile[0];
    hasYear = true;
  }

  mov = name.match(regexNameYear);

  if(mov != null){
    mov = mov[0].replace(/\./g, " ");
    mov = mov.replace(/(\d{4})/g, "")
  }else{
    mov = name.match(/([A-Z])\w+/ig);
    mov = mov.join(" ");
  }

  var p

  MovieDB.searchMulti({query: mov }, function(err, res){

    var info = res.results[0]

    if(info != undefined){

      p = { id: info.id,
             backdrop_path: info.backdrop_path,
             original_title: info.original_title,
             poster_path: info.poster_path,
             popularity: info.popularity
           }

    return fn(err, p)
   }
  });
 }
}
在这里,我试图使用承诺:

var arp = []
arp.push(posters.info('american.horror.story.2014.s03e01.bitchcraft.720p.web-dl.sujaidr.mkv')
arp.push(posters.info('Autómata.2014.720p.BluRay.x264.YIFY.mp4'))
arp.push(posters.info('Evil.Dead.2013.720p.BluRay.x264.YIFY.mp4'))
arp.push(posters.info('Deliver.Us.from.Evil.2014.720p.BluRay.x264.YIFY.mp4'))
arp.push(posters.info('Falling.Skies.2013.S01E01E02.720p.HDTV.x264.mkv'))


Promise.all(arp).then(function(p){
  console.log(p);
})
但我有一个结果:

movieInfo.js:56
    return fn(err, p)
           ^
TypeError: undefined is not a function
我做错了什么


问候。

如果您想使用承诺,请不要再使用回调函数。不要接受
fn
,而是从
info
方法返回承诺!(这就是
承诺。所有的
都期望得到一系列承诺)

所以你的lib:

var Promise = require("bluebird"),
    MovieDB = Promise.promisiyAll(require("moviedb")("470fd2ec8853e25d2f8d86f685d2270e"));
module.exports = {
  info: function(name) {
    …
    return MovieDB.searchMultiAsync({query: mov})
//  ^^^^^^                    ^^^^^
    .then(function(res) {
      var info = res.results[0]
      if (info != undefined)
        return {
          id: info.id,
          backdrop_path: info.backdrop_path,
          original_title: info.original_title,
          poster_path: info.poster_path,
          popularity: info.popularity
        };
    });
  }
}

因此,
fn
undefined
中,因为您没有通过它。我不知道您的
posters.info()
函数如何返回承诺
Promise.all()
只会等待您传递的项目,如果您给它一系列的承诺。而且,您不会将
fn
传递给
posters.info()