How can convert this node.async code to using q? Do I need to return a promise?

In "view" method within my controller was previously using node-async but I wanted to try out using q.

I'm currently trying to convert this

exports.view = function (req, res) {
    var category = req.params.category,
        id = req.params.id,
        ip = req.connection.remoteAddress,
        slug = req.params.slug,
        submission,
        userId = typeof req.session.user !== 'undefined' && req.session.user.id ? req.session.user.id : null,
        views;
var getSubmission = function (submissionId, callback) {
    Submission.getSubmission({
        id: submissionId
    }, function (err, submission) {
        if (err) {
            callback(err);
        } else if (submission) {
            callback(null, submission);
        } else {
            callback(err);
        }
    });
};


async.waterfall([

function (callback) {
    getSubmission(id, callback);
},

function (submission, callback) {
    res.render('submission', {
        title: submission.title + ' -',
        submission: submission
    });
}]);

To using q... I started doing something like:

var getSubmission = function(id) {
  return Submission.getSubmission({
    id : submissionId
  }).then(function(submission) {
    return submission;
  });
};

q.fcall(getSubmission).then(function(submission) {
  console.log(submission);
});

But it's not quite working as I intended. Am I doing something wrong here? How can I do this?

Is Submission.getSubmission a call to a database? Then you can't "chain" promises to that. You'll have to use the deferred method:

var getSubmission = function(id) {
  var deferred = Q.defer();
  Submission.getSubmission({
    id: id
  }, function(err, data){
    if (err) {
      deferred.reject(err);
    } else {
      deferred.resolve(data);
    }
  });
  return deferred.promise;
}

getSubmission(some_id).then(successCallback, failureCallback); 

You can also use Q#denodeify to convert a function using nodejs-style callbacks (function(err, data)) into a promise based function. Thus, the above can also be achieved by the following:

getSubmissionPromise = Q.denodeify(Submission.getSubmission);
getSubmissionPromise({id: some_id}).then(successCallback, failureCallback);