Я пытаюсь использовать Promise, чтобы сделать что-то легкое, но, похоже, это настоящий кошмар с обещаниями. Я думаю, что у меня что-то не хватает.Обезглавленная глубокая карта
Я хотел бы:
- Fetch несколько статей в базе данных
- Посмотрите в каждую статью нашли и перебрать article.authors Array.
- Fetch каждый автор в базе данных (в том числе author.images) для каждой статьи
- Отправить обратно клиент список статей, начиная с шагом один, но обновляются с article.authors.images
I судимым severals способами использования Карты/Каждый/распространение/Reduce/_.clone/_cloneDeep
Но ничего не работает, как ожидалось
Любая помощь будет признателен
return Promise.bind({})
.then(function find_article(){
return Article.find().sort(req.params.sort).skip(req.params.page).limit(req.params.limit).populateAll()
}).then(function(articles){
dataBack = articles
var articlesPromise = Promise.map(articles,function(article){
console.log('------------');
var AuthorsPromise = Promise.map(article.authors,function(author){
return User.findOne(author.id).populateAll().then(function(){
})
})
return Promise.all(AuthorsPromise).then(function(data){
console.log('*******************************');
console.log(data);
return data
})
})
return Promise.all(articlesPromise).then(function(allArticles){
console.log('++++++++++++++++++++++++++++++');
console.log(allArticles);
})
})
.then(function(WhatIsInThere){
console.log('somethinAfter');
console.log(WhatIsInThere);
})
я получил что-то вроде этого, но все еще не работает я до сих пор отсутствую точку .Вса()
Какую базу данных вы используете, это актуально, потому что способ, которым вы строите свои запросы, будет убивать ваш сервер, как только ваша база данных начнет расти. – Yerken
Что касается вопроса, выполните раздельную настройку своей задачи на отдельные этапы. Шаг 1, извлеките статьи, используя запрос базы данных, завернутый в обещания. Шаг 2, функция, которая берет массив статей с использованием Promise.all, и для каждой статьи возвращает еще одно модульное обещание, Promise.all снова, которое берет автора и возвращает изображение автора при поиске db. Верхний уровень api вызовет первый модуль и добавит другие – Yerken
Вам больше не нужно называть 'Promise.all', если вы уже использовали' Promise.map'. Обратите внимание: 'Promise.map (arr, f)' эквивалентен 'Promise.all (arr.map (f))' – Bergi