繁体   English   中英

如何管理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可以保存该对象的“真实”副本,以供以后在async函数中使用。

根据我尝试完成这项工作的多种方式,最终会出现以下错误之一:

TypeError:obj.save不是函数

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

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

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(); 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM