【问题标题】:Node.js Q Promises Multiple ParametersNode.js Q 承诺多个参数
【发布时间】: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


【解决方案1】:

看起来您的 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));

【讨论】:

  • 这里使用闭包范围可能更简单。
  • @NG 感谢您的示例。 user 对象如何传递给 getResponseHandler(res) ?
  • @YarGnawh getResponseHandler(res) 返回一个从updateUserDB 接收用户对象的函数。该函数还可以访问res 对象。
  • 会返回那个匿名函数“重置”堆栈吗?
猜你喜欢
  • 2015-04-15
  • 2015-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-15
  • 1970-01-01
  • 2015-02-25
  • 2015-05-12
相关资源
最近更新 更多