javascript - Node.js Q promise 多个参数

标签 javascript node.js promise q

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

所以我将回调函数转换为返回 promise

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);

super 困惑。任何方向将不胜感激。

最佳答案

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

关于javascript - Node.js Q promise 多个参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25492623/

相关文章:

c++ - C++ 中的延迟/ promise 模式

node.js - Promise.all 调出 "TypeError: undefined is not iterable (cannot read property Symbol(Symbol.iterator))"

javascript - Firebase 'Unhandled Rejection' 和 'Can' t 在设置 header 后设置“JavaScript 错误

javascript - 我怎样才能用Css和Jquery应用这个效果

javascript - 防止在 TinyMCE 中输入默认键盘事件

javascript - 如何创建简单的 div 和网站其余部分透明?

node.js - Mongoose 一处错误处理

jquery - 使用 MySql/Node js 创建通知服务器

javascript - 如何在 Javascript 中将 CLOB 转换为字符串

node.js - sequelize model.create() 方法似乎丢失了