Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 从嵌套的Promise.all返回值_Javascript_Promise_Bluebird_Hexo - Fatal编程技术网

Javascript 从嵌套的Promise.all返回值

Javascript 从嵌套的Promise.all返回值,javascript,promise,bluebird,hexo,Javascript,Promise,Bluebird,Hexo,我问这个问题是因为我可能对蓝鸟的承诺有一个根本性的误解 我无法理解如何从嵌套的、依赖的Promise.alls返回值 不过,我可以在控制台中显示所需的结果。(您可以在注释的console.log中看到我试图返回的数据) 对于上下文,我正在编写一个插件,它获取一组相关的博客文章,然后返回其中的五篇 每个承诺取决于前一个承诺返回的数据 var Promise = require('bluebird') var _ = require('underscore') hexo.extend.helper

我问这个问题是因为我可能对蓝鸟的
承诺有一个根本性的误解

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

不过,我可以在控制台中显示所需的结果。(您可以在注释的
console.log
中看到我试图返回的数据)

对于上下文,我正在编写一个插件,它获取一组相关的博客文章,然后返回其中的五篇

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

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)
        })

      })
    })
  })
});

承诺按
返回值工作。就像常规函数一样。如果您
一个承诺,则您从中返回的值就是外部承诺将假定的值:

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
为此,如果您有一个嵌套链(您永远不必嵌套超过3个级别)-您需要始终从中
返回
,以便访问值:

 return Promise.map(tagList, function(name){ // map is a bluebird utility
   return site.tags.findOne({name: name}).posts.sort('date', -1).limit(25).toArray();
 }).
 then(_.flatten). // flatten the list
 filter(function(item){ 
   return item.title !== title; // filter - also a bluebird utility, like Array#filter
 }).then(function(posts){
   return _.first(_.shuffle(posts), 5);
 });

能否显示指向
site.tags.findOne
文档的链接,是否有解决方案取决于该函数是否为异步函数。感谢您的帮助@t.niese-遗憾的是,据我所知,该函数不在文档中。我发现这是否符合“从每个组中获取5个帖子”的要求(假设“组”是一个标签的帖子)?