如何管理 Node.js 异步变量作用域?
How can I manage Node.js async variable scope?
我有以下代码用于填充我的测试数据库。目的是在每个子文档保存到父文档后,父文档都可以引用它们。
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
}
我已经尝试了一些变体,我认为它与可变范围有关。但是,我认为通过使用 var obj = Object.assign({}, objs[i]) 深度复制我的 obj 会保存对象的“真实”副本以备后用在异步函数中。
根据我尝试使用的多种方法中的哪一种,我最终会遇到以下错误之一:
TypeError: obj.save is not a function
TypeError: Cannot read property 'save' of undefined
我看到一些关于使用 .bind() 来控制变量范围的讨论,但我不确定在这种情况下如何使用它。
Bind
return 一个新函数,您可以指定分配给该函数的上下文(在函数内部调用 "this" 关键字时获得的值) and/or 传递给函数的参数。 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();
我有以下代码用于填充我的测试数据库。目的是在每个子文档保存到父文档后,父文档都可以引用它们。
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
}
我已经尝试了一些变体,我认为它与可变范围有关。但是,我认为通过使用 var obj = Object.assign({}, objs[i]) 深度复制我的 obj 会保存对象的“真实”副本以备后用在异步函数中。
根据我尝试使用的多种方法中的哪一种,我最终会遇到以下错误之一:
TypeError: obj.save is not a function
TypeError: Cannot read property 'save' of undefined
我看到一些关于使用 .bind() 来控制变量范围的讨论,但我不确定在这种情况下如何使用它。
Bind
return 一个新函数,您可以指定分配给该函数的上下文(在函数内部调用 "this" 关键字时获得的值) and/or 传递给函数的参数。 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();