2016-02-08 143 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 
}); 

记住,总是返回嵌套的承诺。