Node.js метеор.js волокна и петля

Хорошо, я изучаю волокна и не знаю, как реализовать «ожидание конца цикла внутри волокна».

Теперь у меня есть этот код, который работает без проблем.

        if (Meteor.isServer) {

        function checkIfIOwnThisItem(callback) {
           setTimeout(function() {
                callback("this callback");
            }, 500);
        }           

        var f = Fiber(function() {
            var fiber = Fiber.current;

            checkIfIOwnThisItem(function(str) {
                fiber.run(str);
            });

            str = Fiber.yield();
            console.log(str);
        });

        f.run();

    }

И мне нужно заменить setTimeout ...FOR...

        _.each(myBank.items,function(loopItem,key,list){
        if (loopItem.itemId == item.itemId) {
            ownItem = true;
            countOfOwnItemInBank = parseInt(loopItem.number);
        }
    }); 

Весь смысл в том, чтобы сначала проверить, есть ли у меня СОБСТВЕННЫЙ ПУНКТ (собственный элемент верен), И ЗАТЕМ я могу делать все, что захочу, но мне нужно убедиться, что ownItem истинен


person Lukas Lukac    schedule 04.09.2013    source источник


Ответы (2)


Похоже, вы начинаете с некоторых воспоминаний о волокнах/потоках в настольном программировании и пытаетесь отобразить точную эквивалентность. Я помню тот мир. Не думай так. Волокна больше предназначены для того, чтобы не ждать ответа, который может прийти в любое время.

Бьюсь об заклад, если вы сделаете меньшие шаги, меньше думаете и просто получите немного HTML/js, чтобы делать то, что хотите, а затем вернетесь сюда, когда вы нажмете останавливающий блок, вы добьетесь прогресса.

Например, право собственности на элементы обычно выражается полем в документе, идентификатором владельца, совпадающим с текущим идентификатором пользователя.

person Jim Mack    schedule 04.09.2013
comment
хм... я хочу спросить, является ли синхронная функция цикла _.each? Разве я не могу просто поставить код после него? Кстати: да, я мог бы просто проверить мини-монго БД, если у меня есть этот элемент, но я думаю, что проверка его в цикле лучше, чем доступ к БД, или я ошибаюсь? - person Lukas Lukac; 05.09.2013
comment
Вместо проверки какого-либо объекта, если вы используете myCollection.find({ownerid: myid}), сомнений нет. Кроме того, если вы рисуете не из коллекции, посмотрите на underscorejs.org/#filter. - person Jim Mack; 05.09.2013
comment
и не могли бы вы ответить на синхронный вопрос из комментария? - person Lukas Lukac; 05.09.2013
comment
Краткий ответ: да. Длинный ответ: что для вас означают синхронный и асинхронный с точки зрения JS через фреймворк Meteor? Какая проблема привела вас к изучению волокон? - person Jim Mack; 05.09.2013
comment
Сомнение в том, что мой код, который требует знать, является ли ownItem истинным (который помещается после каждого цикла (где я это понимаю), будет выполняться до завершения цикла и может иметь плохой ownItem. - person Lukas Lukac; 06.09.2013
comment
Весь код js, который вы пишете, является синхронным, если только вы явно не вызываете асинхронную функцию с обратным вызовом. Особенность node.js в том, что они обнаружили, что это может сделать вещи действительно эффективными. Но обычно вы можете выбирать между синхронной и асинхронной версиями звонка, который вы делаете, в метеоре. Случайного прерывания не происходит. - person Jim Mack; 06.09.2013
comment
Хорошо, тогда мой код в порядке? 1. цикл 2. после цикла какой-то код 3. я в порядке - person Lukas Lukac; 06.09.2013
comment
В общем, да. Я не уверен, что вам когда-нибудь понадобятся волокна, судя по всему, что вы описали. Если это так, вы можете принять ответ, чтобы помочь другим узнать, что сработало. - person Jim Mack; 06.09.2013
comment
я был, вероятно, слишком параноиком, поэтому я останусь с обычным циклом => затем код. Без волокон. Спасибо за ваше время и объяснение. Отметить как ответ. - person Lukas Lukac; 07.09.2013

Fiber(function() {
  _.each(myBank.items,function(loopItem,key,list){
    if (loopItem.itemId == item.itemId) {
        ownItem = true;
        countOfOwnItemInBank = parseInt(loopItem.number);
    }
  }); 
}).run();

Этот код должен работать синхронно.

person Denis    schedule 05.09.2013
comment
Как я понимаю, вы нашли способ запустить код синхронно вне методов метеора, и вы хотите использовать стандартную среду метеора. Итак, это пример того, как вы это получаете. - person Denis; 05.09.2013