Javascript Node.js Q承诺有多个参数

Javascript Node.js Q承诺有多个参数,javascript,node.js,promise,q,Javascript,Node.js,Promise,Q,试图在我的nodejs express应用程序中使用Q promise库清理我的回调意大利面代码,但我在翻译其中的某些部分时遇到了问题。无法将多个参数传递给函数并处理范围 下面是一个简化的“同步”版本来显示我的逻辑: function updateFacebook(req, res) { var user = getUserFromDB(userid); var profile = getUserProfileFromAPI(accessToken); var succ

试图在我的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);

超级困惑。任何方向都将不胜感激

看起来您的
handleResponse
需要两个参数,但是
updateUserDB
只解析一个对象。你可以这样做:

function getResponseHandler(res) {
    return function(user) {
        // your handleResponse code here
        // which now has access to res
    }
}
然后像这样称呼它:

Q.all([getUserFromDB(userid), getUserProfileFromAPI(accessToken)])
 .spread(updateUserDB)
 .done(getResponseHandler(res));

向UpdateUserDbMongo用户对象和facebook json响应传递了哪些参数。@YarGnawh除了res之外,这实际上看起来是正确的用法。您是在询问如何传递
res
?还有+1表示清楚的问题和同步示例。@BenjaminGruenbaum是的。由于
deferred.resolve()
只能传递一个参数,
spread()
是唯一的选项。我不知道我怎样才能完成
handleResponse(res,user)
稍微偏离主题的问题。。。在开始时将
res
对象绑定到承诺有意义吗
Q.bind({res:res})。当(..)
在这里使用闭包作用域可能更简单。@NG感谢您提供的示例。
user
对象如何传递给
getResponseHandler(res)
?@YarGnawh
getResponseHandler(res)
返回从
updateUserDB
接收用户对象的函数。该函数还可以访问
res
对象。返回该匿名函数是否会“重置”堆栈?