2016-12-31 4 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 

ist ein Mongoose Schema. Ich habe eine Frage:Verstehen Rückkehr Aussage mit Db/Karte JS

Q: Warum brauchen wir die "Return" -Anweisung neben "db.doneTodo ..."? Warum ist die zweite "Rückkehr" nicht genug?

Meine Argumentation: Da wir Karte auf jedes Element anwenden wir die Anwendung dieser Funktion:

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

Und

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

Wertet zu

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

SO FUNKTIONIERT:

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

auswerten zu

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

So wir es zurückgeben?

Antwort

0

Ja, Sie sind teilweise richtig. .then() gibt Promise zurück, und wenn Sie einen Wert aus zurückgeben, wird es Promise.resolve(<value>) effektiv zurückgeben.

In der Tat, der folgende Code gibt (oder eher lösen Sie die Versprechen mit diesem Objekt als Wert) das Objekt.

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

Q: Warum brauchen wir die "return" Aussage neben "db.doneTodo..."? Warum ist nicht die zweite "return" genug?

Sie wollen das Ergebnis an den Promise.all() Funktionsaufruf zurück, die alle gelöst Versprechen Werte in einem Array wickeln werden, die dann von dem Versprechen, dass die .all() Funktion zurückkehrt behoben ist.

Wenn Sie die oben return Anweisung wegzulassen, würde der Code immer noch laufen, aber wenn man die Promise.all(...).then((arrayOfResults) => { ... }) gekettet, die arrayOfResults eine Reihe von undefined Werte enthalten würde.

Verwandte Themen