Проходить удостоверение личности возвращенное наружной функцией к внутренней функции

У меня есть вложенная функция в обработчике событий. Внешняя функция создает копию документа из коллекции деревьев. Затем внутренняя функция создает копии любых документов из коллекции Branches, идентификаторы которых включены в массив в treeBranchesполе исходного документа дерева.

Мне нужно перейти newTreeIdот внешней функции к внутренней функции, чтобы новые идентификаторы ветвей могли быть добавлены в массив в новом документе. console.log(newTreeID)во внутренней функции в настоящее время возвращается undefined.

Template.Actions.events({
    'change .action-selection': function(e) {
        e.preventDefault();
        var selection = $(e.target).val();
        var currentTreeId = this._id;
        var branches = Branches.find({_id:{$in:this.treeBranches}});

        switch(selection) {
            case "repeat":
                return Meteor.call('treeRepeat', currentTreeId, function (newTreeId) {
                    branches.forEach(function(b) {
                        var currentBranchId = b._id;
                        console.log(newTreeId);
                        Meteor.call('treeBranchesRepeat', currentBranchId, newTreeId, function () {
                        });
                    });
                });
                break;
                ...

Meteor.methods({
    treeRepeat: function(currentTreeId) {
        check(currentTreeId, String);

        var tree = Trees.findOne({_id:currentTreeId}, {fields:{_id:0, treeBranches:0}});
        var newTreeId = Trees.insert(tree);

        return {
            _id: newTreeId
        };
    },
    treeBranchesRepeat: function(currentBranchId, newTreeId) {
        check(currentBranchId, String);
        check(newTreeId, String);

        var branch = Branches.findOne({_id:currentBranchId}, {fields: {_id: 0}});
        var newBranchId = Branches.insert(branch);
        Trees.update({_id:newTreeId},{$push:{treeBranches:newBranchId}});

        return {
            _id: newBranchId
        };
    }
});

1 ответ

  1. Я думаю, что это может быть упрощено путем выполнения всех дубликатов дерева и ветвей все по одному запросу на сервер. Предлагая следующий рабочий процесс (не протестирован, но я думаю, что вы получите идею):

    Template.Actions.events({
        'change .action-selection': function(e) {
            e.preventDefault();
            var selection = $(e.target).val();
            var currentTreeId = this._id;
            var currentTreebranches = this.treeBranches;
    
            switch(selection) {
                case "repeat":
                    return Meteor.call('treeAllRepeat', currentTreeId, currentTreebranches, function (err, res) {
                      if (err) { console.log(err); }
    
                      console.log(res); // Your new tree _id
                    });
                    break;
                    ...
    
    Meteor.methods({
        treeAllRepeat: function(currentTreeId, branchIds) {
            check(currentTreeId, String);
            check(branchIds, [String]);
    
            var tree = Trees.findOne({ _id: currentTreeId }, { fields: { _id: 0, treeBranches: 0 } });
    
            if (!tree) {
              throw new Error('Tree with id ' + currentTreeId + ' not found');
            }
    
            var newTreeId = Trees.insert(tree);
            var branches = Branches.find({ _id: { $in: branchIds || [] } });
    
            branches.forEach(function (branch) {
              var newBranch = Branches.findOne({ _id: branch._id }, { fields: { _id: 0 } });
              var newBranchId = Branches.insert(newBranch);
              Trees.update({ _id: newTreeId }, { $push: { treeBranches: newBranchId } });
            });
    
            return {
              _id: newTreeId
            };
        }
    });
    

    Я предполагаюthis.treeBranches, что это идентификаторы ветвей? Если нет, вы, вероятно, хотите сделать что — то вроде:

    var currentTreebranches = _.pluck(this.treeBranches, '_id');
    

    ПС. Помните, что если вы удалили пакет, подпишитесь на новое деревоautopublish.