如何在等待asynchronous方法完成时正确地发布响应?

希望这个会很简单,但对我来说有一点困惑。

这是模块中的设置。 尤其请参阅****标注的评论:

exports.saveWall = function (req, res) { var status; mongoClient.connect(connectionString, function (err, db) { if (err) { return console.dir(err); } db.collection(pictureWallsCollectionName).insert( { _id: req.body.wallId, pictures: req.body.pictures }, function (err, res) { db.close(); if (err) { status = 500; console.dir(err); } else { status = 200; //*****can't do this here, because res is out of scope! res.status(status).send(http.STATUS_CODES[status]) console.log('Inserted into the ' + pictureWallsCollectionName + ' collection'); } }); }); //*****can't do this yet because the above isn't done. res.status(status).send(http.STATUS_CODES[status]) } 

我基本上想在我的callback中调用res.status(status).send(http.STATUS_CODES[status])这行,但是我不能这样做,因为res.status在那个时候是空的。

我想要做的就是回复POST。 但是我正在把我的头撞到一堵看起来很简单的墙上。 帮帮我!

即使你解决了你的范围问题(这太棒了),嵌套callback可能会很快变得棘手(如你所见)。 处理这个问题的一个好方法就是使用承诺。 承诺的两个主要包是Q和蓝鸟 (蓝鸟是我最喜欢的)。

你也可以使用一个已经承诺过的包,例如promised-mongo

一旦你完成了所有的设置,这只是一个链接的问题,然后是连续的步骤,然后在解决诺言时发送你的回应。

对于一个特定的例子,检查这个答案 ,看看是否有帮助。

啊…

事实certificate,我的问题是“res”在这里被定义为:

 exports.saveWall = function (req, res) { 

…和这里:

 db.collection(pictureWallsCollectionName).insert(..., function (err, res) { 

…所以事实certificate,我可以称之为“水库”一直以来,我只是想调用错误的“水库”,因为它被重新定义。

在旁边注意,f ***你,javascript!