我如何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();
- 使用asynchronous瀑布填充查询选项
- Node.jsasynchronous并行TypeError:任务不是一个函数
- 使用Caolan的asynchronous模块返回一个值
- asynchronous瀑布不正确保存与mongoose
- asynchronous等待node.js跳过第二个等待语句保存mongodb
- async.whilst中的callback和错误是什么?
- Async.retry在等待间隔之前立即执行
- 是否有可能build立一个dynamic的任务列表nodejsasynchronous(瀑布,系列等…)
- node.js async.js nextTick vs setImmediate