从嵌套的Promise.alls返回值

时间:2015-11-21 19:03:33

标签: javascript promise bluebird hexo

我问这个问题,因为我可能对蓝鸟的Promise.all如何运作有一个基本的误解:

我无法理解如何从嵌套的,依赖的Promise.alls 返回值。

可以获得所需的结果以便在控制台中显示。 (您可以在注释console.log中看到我想要返回的数据。)

对于上下文,我正在编写一个Hexo插件,该插件获取相关博客帖子的集合,然后返回其中的五个。

每个承诺取决于先前承诺返回的数据。

var Promise = require('bluebird')
var _ = require('underscore')

hexo.extend.helper.register("related_posts", function (site) {
  var site = site
  var post = this.page
  var tags = post.tags
  var title = post.title
  var tagList = tags.map(function(tag){
    return tag.name
  })

  // get 5 posts from each group and add them to a posts array
  var PostsArray = []

  Promise.all(tagList).then(function(items){
    items.forEach(function(theTag){
      PostsArray.push(site.tags.findOne({name: theTag}).posts.sort('date', -1).limit(25).toArray())

      Promise.all(PostsArray).then(function(posts){
        var thePosts = _.flatten(posts)
        var finalListOfPosts = []

        thePosts.forEach(function(post){
          if(post.title != title){
            finalListOfPosts.push(post)
          }
        })

        Promise.all(finalListOfPosts).then(function(posts){
          var relatedPosts = _.first(_.shuffle(posts),  5)
          // MY DATA IS CONSOLE.LOGGED AS I WOULD EXPECT
          // BUT HOW DO I RETURN IT?
          console.log(relatedPosts)
        })

      })
    })
  })
});

1 个答案:

答案 0 :(得分:1)

承诺按--enable-profiling值工作。就像常规功能一样。如果你return承诺你从那时返回的值是外部承诺所假定的值:

then

为此,如果你有一个嵌套链(你永远不必嵌套超过3个级别) - 你需要var p = Promise.resolve().then(() => { // resolve creates a new promise for a value return 3; // can also return another promise here, it'll unwrap }); p.then(alert); //alerts 3 从它一直到访问该值:

return