我如何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();
- 我可以在async.js forEach中扩展迭代器的function吗?
- javascript nodejs if语句是以意外的顺序调用的
- async.map或async.each与async.parallel有什么不同?
- 在JavaScript中asynchronous迭代大量数组,而不会触发超出的堆栈大小
- 如何按照数组内容的顺序执行async.map函数
- MEAN 2多租户(多个集合保存相互参考)
- 在Node.js中使用MongoDB进行扩展,我应该什么时候一次查询所有的ID,并行查询每个ID?
- 从一个ID数组到一个名称数组(mongo,nodejs)
- NodeJS,asynchronousforEachSeries执行顺序