我如何pipe理Node.jsasynchronousvariables作用域?

我有以下代码来填充我的testing数据库。 目标是将每个子文档之后的父文档保存到父文档中,以便对其进行引用。

function saveRecipe(ingredients, directions, recipe, done) { var ingredientSaveTasks = createSaveTasks(ingredients) var directionSaveTasks = createSaveTasks(directions) async.parallel([ (callback) => { async.series(ingredientSaveTasks, callback) }, (callback) => { async.series(directionSaveTasks, callback) } ], (err, results) => { recipe.ingredients = results[0] // The returned ids for each ingredient recipe.directions = results[1] // The returned ids for each direction recipe.save(done) }) } function createSaveTasks(objs) { var saveTasks = [] for (var i = 0; i < objs.length; i++) { var saveTask = function (callback) { var obj = Object.assign({}, objs[i]) obj.save((err, result) => { callback(err, result._id) }) } saveTasks.push(saveTask) } return saveTasks } 

我已经尝试了一些这方面的变化,我认为这与variables范围。 然而,我想通过深层复制我obj var obj = Object.assign({},objs [i])将保存对象的“真实”的副本,以供以后在asynchronous函数内使用。

根据我试图使这项工作的许多方法中的哪一个,我最终以下错误之一:

TypeError:obj.save不是一个函数

TypeError:无法读取未定义的属性“保存”

我已经看到一些关于使用.bind()来控制variables范围的讨论,但是我不确定在这种情况下如何使用它。

Bind返回一个新的函数,您可以指定分配给函数的上下文(在函数内调用“this”关键字时获得的值)和/或传递给函数的参数。 Bind(thisArg, ...arguments) 。 所以在你的情况下:

var saveTask = function(callback){this.save(...)}.bind(obj[i])

有了这个你可以指定上下文,所以在这个函数中你的对象将会被this 。 一些例子:

 (function a(){console.log(this)}).bind({key : 'value'})(); var a = function(){console.log(this)}.bind({key : 'value'}); a();