2016-12-31 98 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/Map的返回語句JS

問:爲什麼我們需要「db.doneTodo ...」旁邊的「return」語句?爲什麼第二個「回報」不夠?

我的理由:由於我們正在申請地圖的每個元素,我們正在申請此功能:

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

也是如此:

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

問:我們爲什麼需要 「db.doneTodo...」 旁邊的 「return」 的聲明?爲什麼 不是第二個「return」就夠了?

你想要的結果返回給Promise.all()函數調用,將包裹在一個數組,然後自許的.all()函數返回解決所有解析承諾值。

如果你省略頂級return聲明,代碼將仍然運行,但如果你的鏈接Promise.all(...).then((arrayOfResults) => { ... }),該arrayOfResults將包含許多undefined值。