2013-03-22 50 views
4

我正在用node/express/mongoose构建一个站点,它在查看提交时需要执行以下操作。如何使用节点异步来获取我的猫鼬呼叫?

我遇到的问题是以非串行方式进行数据库读取。例如,我会做一些调用来获取一些数据,但是一些调用可能不会完成,直到执行环境转到另一个。试图使用npm模块,async,但在尝试弄清楚我将如何整合它时遇到困难。

这里是我的代码:

var getViewCount = function(submissionId) { 
    Submission.getSubmissionViewCount({ 
    submissionId : submissionId 
    }, function(err, count) { 
    if (err) { 
     throw err; 
    } 

    if (count) { 
     return count; 
    } 
    }); 
}; 

var getVotes = function(submissionId) { 
    console.log('getvotes'); 
    Submission.getSubmissionVotes({ 
    submissionId : submissionId 
    }, function(err, votes) { 
    return votes; 
    }); 
}; 

var getSubmission = function(id) { 
    Submission.getSubmission({ 
    id : id 
    }, function(err, submission) { 
    if (err) { 
     throw err; 
    } 

    if (submission) { 
     return submission; 
    } 
    }); 
}; 

var renderSubmission = function(title, submission, views) { 
    res.render('submission', { 
     title: submission.title + ' -', 
     submission: submission, 
     views: views.length 
    }); 
}; 

如何使用这与异步?或者我应该使用async.series而不是async.async

async.series([ 
    function(callback) { 
    var submission = getSubmission(id); 
    callback(null, submission); 
    }, 
    function(callback) { 
    // getViewCount(submissionId); 
    }, 
    function(callback) { 
// getVotes(submissionId); 
    }, 
    function(callback) { 
    //renderSubmission(title, submission, views); 
    } 
    ], function(err, results) { 
    console.log(results); 
    }); 

基本上我想先取得意见和投票,然后呈现我的提交。

+1

在'getSubmission'函数的返回,例如,不从Submission.getSubmission'的'回调返回任何东西。你需要沿submitId参数也给它一个回调,并在数据库回调,而不是'回报提交'里面'回调(提交)' – TheBrain 2013-03-22 09:39:25

+1

你看过异步的队列方法吗?总体思路是@ TheBrain和RobertMitchell所建议的。回调函数是关键。在过去,我已经使用queue,drain和forEach(用于db调用列表)方法成功地向MS SQL服务器进行异步调用。 – DotNetWala 2013-03-22 15:38:56

+1

尝试寻找到基于承诺的解决方案: http://stackoverflow.com/questions/11912573/node-js-deferred-promisify-mongoose/11931908#11931908 http://stackoverflow.com/问题/ 10545087/how-to-use-q-module-for-refactoring-mongoose-code/10554943#10554943 – 2013-03-22 22:21:03

回答

2

TheBrain对您应该对代码进行的整体结构变更的描述是准确的。 Node中的基本方法是嵌套一系列回调函数;你很少需要实际返回值的函数。相反,您可以定义一个将回调作为参数并将结果传递给该回调的函数。请查看下面的代码澄清(其中cb是一个回调函数):

var getViewCount = function(submissionId, cb) { 
    Submission.getSubmissionViewCount({ 
     submissionId : submissionId 
    }, function(err, count) { 
     if (err) { 
      throw err; 
     } 

     if (cb) { 
      cb(count); 
     } 
    }); 
}; 

var getVotes = function(submissionId, cb) { 
    console.log('getvotes'); 
    Submission.getSubmissionVotes({ 
     submissionId : submissionId 
    }, function(err, votes) { 
     if (cb) { 
      cb(votes); 
     } 
    }); 
}; 

var getSubmission = function(id, cb) { 
    Submission.getSubmission({ 
     id : id 
    }, function(err, submission) { 
     if (err) { 
      throw err; 
     } 

     if (cb) { 
      cb(submission); 
     } 
    }); 
}; 

var renderSubmission = function(submissionId) { 

    getSubmission(submissionId, function (submission) { 
     if (!submission) { 
      // unable to find submission 
      // add proper error handling here 
     } else { 
      getViewCount(submissionId, function (viewCount) { 
       res.render('submission', { 
        title: submission.title + ' -', 
        submission: submission, 
        views: viewCount 
       }); 
      }); 
     } 
    }; 
}; 
+0

啊是啊,这回调汤后一段时间变得相当sl but,但抛出回调作为最后一个参数工作正常。我会坚持下去,直到找到更好的方法。谢谢。 – 2013-03-24 07:31:37