【发布时间】:2014-08-26 03:03:48
【问题描述】:
尝试使用我的 nodejs express 应用程序中的 Q Promise 库来清理我的回调意大利面条代码,但我在翻译其中的某些部分时遇到了问题。将多个参数传递给函数和处理范围时遇到问题。
这是一个简化的“同步”版本来展示我的逻辑:
function updateFacebook(req, res) {
var user = getUserFromDB(userid);
var profile = getUserProfileFromAPI(accessToken);
var success = updateUserDB(user, profile);
res.json({ result: success });
}
所以我将回调函数转换为返回承诺
function getUserFromDB(userid) {
var deferred = Q.defer();
// somewhere in here there's a deferred.resolve(user object);
queryMongo()...
return deferred.promise;
}
function getUserProfileFromAPI(accessToken) {
var deferred = Q.defer();
// somewhere in here there's a deferred.resolve(profile object);
request()...
return deferred.promise;
}
function updateUserDB(user, profile) {
var deferred = Q.defer();
// somewhere in here there's a deferred.resolve(updated user object);
updateMongo()...
return deferred.promise;
}
function handleResponse(res, user) {
var deferred = Q.defer();
// was thinking about putting the res.json here
// i have no way of passing in the res
// and res is out of scope...
res.json({});
return deferred.promise;
}
现在问题是把它们连接起来,我试过了……
Q.when(getUserFromDB(userid), getUserProfileFromAPI(accessToken))
.spread(updateUserDB)
.done(handleResponse);
Q.all([getUserFromDB(userid), getUserProfileFromAPI(accessToken)])
.spread(updateUserDB)
.done(handleResponse);
超级困惑。任何方向将不胜感激。
【问题讨论】:
-
哪些参数被传递给 updateUserDb
-
mongo 用户对象和 facebook json 响应。
-
@YarGnawh 这实际上看起来是正确的用法,除了 res。您是在问如何通过
res?对于明确的问题和同步示例也 +1。 -
@BenjaminGruenbaum 是的。因为
deferred.resolve()只能传递一个参数,所以spread()是唯一的选择。我不知道我怎么能满足handleResponse(res, user) -
有点离题的问题...在开始时将
res对象绑定到承诺是否有意义?Q.bind({ res: res }).when(....)
标签: javascript node.js promise q