2016-12-31 2 views
0
Promise.all(membersArray.map((member) => { 
    return db 
     .doneTodo 
     .find({'victor._id': member._id}) 
     .then((userVictories) => { 
      return { 
       email: member.email, 
       victories: userVictories.length 
      }; 
     }); 
})).then((memberStats) => { 
    console.log(membersStats); 
}); 

db.doneTodo 

- схема Mongoose. У меня есть вопрос:Пояснения к заявке на возврат с Db/Карта JS

Вопрос: Зачем нам нужно «возвращение» рядом с «db.doneTodo ...»? Почему еще не второй «возврат»?

Мои рассуждения: Поскольку мы применяем карту к каждому элементу мы применяем эту функцию:

{ 
       return db 
        .doneTodo 
        .find({'victor._id': member._id}) 
        .then((userVictories) => { 
         return { 
          email: member.email, 
          victories: userVictories.length 
         } 
        }); 
      } 

И

.then((userVictories) => { 
         return { 
          email: member.email, 
          victories: userVictories.length 
         } 

Оценивает к

{ 
           email: member.email, 
           victories: userVictories.length 
          } 

SO ДЕЛАЕТ:

db 
         .doneTodo 
         .find({'victor._id': member._id}) 
         .then((userVictories) => { 
          return { 
           email: member.email, 
           victories: userVictories.length 
          } 
         }); 
       } 

Вычисляется в

{ 
            email: member.email, 
            victories: userVictories.length 
           } 

Таким образом, мы вернуть его?

ответ

0

Да, вы частично правы. .then() возвращает Promise, и если вы вернете значение в пределах .then(), оно эффективно вернет Promise.resolve(<value>).

Так, действительно, следующий код действительно возвращает (или, вернее, разрешить обещание с этим объектом в качестве значения) объекта.

.then((userVictories) => { 
    return { 
     email: member.email, 
     victories: userVictories.length 
    } 
}); 

Q: Почему нам нужно "return" заявление "рядом db.doneTodo..."? Почему не является вторым «return»?

Вы хотите вернуть результат вызов в Promise.all() функции, которая будет обернуть все разрешенные значения обещания в массиве, который затем решен с обещания, что .all() функция возвращает.

Если вы должны были опустить верхнюю return заявления, код будет по-прежнему работать, но если вы прикованы к Promise.all(...).then((arrayOfResults) => { ... }), то arrayOfResults будет содержать ряд undefined значений.

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