在嵌套的asynchronous模块函数中,“this”将如何正常运行?

我使用Sails.js框架和伟大的模型的function,我也使用它作为其依赖的async版本。

所以,为了解释一个实际的场景: 得到一个艺术家所唱的歌曲的所有评论 。 我应该首先查询歌曲,然后查询评论。

这就是为什么我使用async模块,特别是它的waterfallfunction。 但是,由于所有这些代码都放在一个Model文件中,而this文件是指模型本身,所以我有一个很大的疑问:

即使存在asynchronousfunction,这是否也会引用模型?

这是我正在做的一个代码示例:

 module.exports = { connection: 'seasonDB', attributes: { reachesMaxFavoriteTeam: function (team) { var results []; async.waterfall([ // Get favorite team function (cb) { var userTeam = this.userTeam; UserTeam.findOne({_id: userTeam}, function (err, foundUserTeam) { if (err) cb(err,null); var user = foundUserTeam.user; User.find({_id: user}, {_id:false, fanOf: true}, function (err, fanOf) { if (err) cb(err,null); cb(null,fanOf.name); }); }); }, // Check if it reaches a max favorite team error function (favoriteTeam,cb) { // If player to be added is from favorite team, it counts. favoriteCount = team === favoriteTeam ? 1: 0; // Check if any of added players are from favorite team too. _.forEach(this.players, function (player) { var playerTeam = player.team.name; if (playerTeam === favoriteTeam) favoriteCount++; }); return favoriteCount > process.env.CONDITION; }]); } }; 

所以,例如,在瀑布系列的第一个function,我得到: var userTeam = this.userTeam; ,这会按预期工作吗? 我应该照顾一些其他嵌套function的情况吗?

为什么你不使用Promises在这些查询将使它更容易处理。 我不会使用asynchronous,使用承诺应该做的工作。

Sails中的底层ORM模块是Waterline。 你可以参考一个示例或GitHub页面https://github.com/balderdashy/waterline ,其中显示了下面的例子,

 User.findOne() .where({ id: 2 }) .then(function(user){ var comments = Comment.find({userId: user.id}).then(function(comments){ return comments; }); return [user.id, user.friendsList, comments]; }).spread(function(userId, friendsList, comments){ // Promises are awesome! }).catch(function(err){ // An error occurred }) 

Waterline-docs也有助于参考: https : //github.com/balderdashy/waterline-docs