2015-11-21 3 views
1

Я задаю этот вопрос, потому что я мог бы иметь фундаментальное непонимание того, как Promise.all работ Bluebird в:Возврат Значение из вложенных Promise.alls

У меня возникли проблемы с пониманием, как я вернуть значение из вложенных, зависит, Promise.alls.

I может получить желаемый результат для отображения в консоли. (вы можете увидеть данные, которые я пытаюсь вернуть в комментарии 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) 
     }) 

     }) 
    }) 
    }) 
}); 
+0

Можете ли вы показать ссылку на документацию 'site.tags.findOne', если есть решение или нет, зависит от того, если что функция isync или нет. –

+0

Спасибо за помощь @ t.niese - к сожалению, эта функция не указана в документах, насколько я могу судить. Я нашел это [здесь] (http://1pixelout.net/2015/09/18/writing-hexo-template-helpers/) –

ответ

1

Обещает работу return значение. Как и обычные функции. Если вы then обещание значения возвращения из тогдашних этого значения внешнего обещание будет предполагать:

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 от него всю дорогу, чтобы получить доступ значение:

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); 
}); 
+0

Соответствует ли это требованиям «получить 5 должностей от каждой группы» (где предположительно «группа» msgstr "есть отметка в сообщениях)? –

 Смежные вопросы

  • Нет связанных вопросов^_^