Node.js Q Promises Multiple Parameters

Trying to clean up the spaghetti callback code using the Q promise library in my expressjs express app, but I'm having trouble translating some parts of it. Having trouble passing multiple arguments to functions and handling scope.

Here's a simplified "synchronous" version to show my logic:

function updateFacebook(req, res) {
    var user = getUserFromDB(userid);
    var profile = getUserProfileFromAPI(accessToken);

    var success = updateUserDB(user, profile);
    res.json({ result: success });
}

      

So I am converting the callback functions to return promises

function getUserFromDB(userid) {
    var deferred = Q.defer();
    // somewhere in here there a deferred.resolve(user object);
    queryMongo()...
    return deferred.promise;
}

function getUserProfileFromAPI(accessToken) {
    var deferred = Q.defer();
    // somewhere in here there a deferred.resolve(profile object);
    request()...
    return deferred.promise;
}

function updateUserDB(user, profile) {
    var deferred = Q.defer();
    // somewhere in here there 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;
}

      

Now the problem is with them, I tried ...

Q.when(getUserFromDB(userid), getUserProfileFromAPI(accessToken))
 .spread(updateUserDB)
 .done(handleResponse);

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

      

Super confused. Any direction would be much appreciated.

+3


source to share


1 answer


It looks like yours handleResponse

expects two parameters, but updateUserDB

only allows one object. You can do something like:

function getResponseHandler(res) {
    return function(user) {
        // your handleResponse code here
        // which now has access to res
    }
}

      



and then call it like this:

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

      

+3


source







All Articles