2016-02-08 73 views
0

我正試圖找到一種方式/最好的方式來使用我的節點應用程序中的承諾。
我會說實話,我不會100%理解承諾,但是我越來越擅長更多的練習。使用承諾/節點

什麼目前,我希望做的是在有人登錄後:

  1. 獲取Facebook的訪問令牌
  2. 訪問權限的用戶配置文件,更新MongoDB中的用戶文件或創建如果一個新的用戶文件他們不存在
  3. 訪問Facebook好友列表並交叉引用Mongodb中的「朋友」文檔。

問題我已經做了第3點,我要求來自點1的訪問令牌和用戶文檔在點2中存在或新創建,以傳入第三個函數。

我的功能鏈的樣子:

getAccessToken(req) 
.then(function(accessToken){ 
getUserProfile(req, accessToken) 
.then(findUser.bind(null, req, res)) 
    .then(...) 
}); 

getAccessToken返回 「的accessToken」 從Facebook。 getUserProfile從Facebook返回用戶。 findUser在Mongodb中查找存在或創建新的用戶文檔。

如何返回現有或新創建的用戶對象,並通過與承諾形式的accessToken結合傳遞?

回答

1

您可以嵌套承諾:

getAccessToken(req) 
.then(function(accessToken) { 
    return getUserProfile(req, accessToken) 
    .then(findUser.bind(null, req, res)) 
    .then(function(user) { 
    // use accessToken & user 
    }) 
}); 

或存儲解決值外範圍:

var _accessToken; 
getAccessToken(req) 
.then(function(accessToken) { 
    _accessToken = accessToken; 
    return getUserProfile(req, accessToken); 
}) 
.then(findUser.bind(null, req, res)) 
.then(function(user) { 
    // use _accessToken & user 
}); 

記住,總是返回嵌套的承諾。