如何管理Node.js异步变量范围?

时间:2016-06-28 21:08:47

标签: javascript node.js async.js

我有以下代码来填充我的测试数据库。目标是在每个子文档发送到父文档后保存父文档可以引用它们。

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
}

我已经尝试了一些变体,我认为这与变量范围有关。但是,我想通过深度复制我的obj与 var obj = Object.assign({},objs [i])将保存&#34;真实&#34;该对象的副本供以后在异步函数中使用。

根据我试图完成这项工作的众多方式中的哪一项,我最终会遇到以下错误之一:

  

TypeError:obj.save不是函数

     

TypeError:无法读取属性&#39; save&#39;未定义的

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

1 个答案:

答案 0 :(得分:2)

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

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

使用此方法指定上下文,因此在该函数中,您的对象将可以作为this访问。 一些例子:

&#13;
&#13;
(function a(){console.log(this)}).bind({key : 'value'})();

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