2013-06-07 1 views
1

В режиме «просмотра» в моем контроллере ранее использовался node-async, но я хотел попробовать, используя q.Как преобразовать этот код node.async в использование q? Нужно ли мне возвращать обещание?

В настоящее время я пытаюсь преобразовать этот

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

Для использования д ... Я начал делать что-то вроде:

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

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

Но это не совсем работает, как я предполагал. Я здесь что-то не так? Как я могу это сделать?

ответ

1

Submission.getSubmission звонок в базу данных? Тогда вы не можете «переложить» на это обещания. Вы должны будете использовать deferred метод:

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

Вы также можете использовать Q#denodeify для преобразования функции с использованием обратных вызовов nodejs стиля (function(err, data)) в функцию посыла основы. Таким образом, вышеизложенное также может быть достигнуто следующим образом:

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

Плохой человек-помощник спасибо. Нужно ли мне создавать новую отложенную в рамках каждой области? Как если бы я связал другой вызов, чтобы что-то сделать с представлением вроде getSubmissionViews, я создаю новый отложенный в этой области? Или передать ему первый? –

+0

Если все ваши асинхронные функции всегда возвращают одну и ту же подпись ('function (err, data)'), вы можете использовать 'getSubmissionAsPromise = Q.denodeify (Submission.getSubmission); getSubmissionAsPromise ({id: 123}), затем (successCallback, errorCallback); '. –

+0

Но скажу, что я использовал denodeify и в моем 'then' хотел вызвать getCommentsAsPromise ({submissionId: submission._id}), но вы можете видеть, что я бы использовал идентификатор отправки из возвращаемого объекта из первого denodeify, как бы я сделал что? Ака .. держи целую цепочку –