2014-10-13 2 views
0

У меня проблемы с wrapAsync + метод + сеансы.wrapAsync + метод + сеанс

Как правильно реализовать WrapAsync? Я хочу в шаблоне узнать, есть ли у пользователя хотя бы один элемент, созданный им. И затем определите, может ли он создать другой элемент.

Теперь я получаю эту ошибку:

W20141013-15:04:43.237(-3)? (STDERR) Error: Can't wait without a fiber 

Но я не мог найти волокно в документации. И для реализации этого, действительно ли это необходимо? На стороне клиента я хочу что-то вроде:

//pagina.js 
Template.pagina.helpers{ 
    userHasItem: return Session.get('userHasItem'); 
} 
//pagina.js 

Meteor.call('userHasItem', Meteor.userId(), function (error,result) { 

    Session.set('userHasItem', result); 
}); 

// на стороне сервера:

if(Meteor.isServer){ 

    Meteor.startup(function() { 

     var userHasItemAsync = function (userId) { 
      setTimeout(function() { 
       if (Items.findOne({'userId': userId})) { 
        return true; 
       } else { 
        return false; 
       } 
      }, 4000); 
     }; 


    Meteor.methods({ 


     userHasItem: function(userId) { 

      var userHasItemSync = Meteor.wrapAsync(userHasItemAsync), 
       result; 
      try { 
       userHasItemSync(userId); 

       console.log(result); 
       return result; 
      }catch (e) { 
       console.log('erreur', e.message); 
       throw new Meteor.Error(500, e); 
      } 

     }, 

    } 
    }); 
} 

ответ

0

Не удается получить ваши ошибки воспроизвести на основе существующего кода.

Тем не менее, userHasItemAsync недоступен, так как вы определили его локально в функции Meteor.startup. Но ошибка, которую вы должны получить в этом случае, - userHasItemAsync is undefined.

Кроме того, код, введенный здесь, имеет несколько ошибок (я предполагаю, что вы набрали его, не копируя/вставляя из своего проекта): шаблон вместо шаблона, шаблон определяется вне isClient (возможно, он находится в файле, доступном для клиент) и т. д. Из-за этого трудно воспроизвести ваш конкретный случай.

0

Нет необходимости вызывать метод сервера, чтобы узнать, существует ли элемент (при условии, что вы настроили правильные публикации/подписки), и не нужно называть wrapAsync. Фактически, то, чего вы хотите достичь, даже не требует сеанса. Весь код может быть в конечном счете, к этому дистиллированную:

Template.pagina.helpers{ 
    userHasItem: return Items.find({ userId: Meteor.userId() }).count() > 0; 
} 

Курсора возвращаемого Items.find реактивный сам по себе, так что нет никакой необходимости в использовании сеанса.

+0

@cleliodpaula Извините, не могли бы вы пояснить, что вы имеете в виду? – mark

+0

Это была моя первая попытка, для очевидных условий. Я уже реализовал это решение. для того, чтобы это работало правильно, мне нужно обновить страницу. Позвольте мне объяснить поток: Когда пользователь создает элемент, заполнив форму, после отправки пользователь перенаправляется на страницу «Список элементов», если он не создал какой-либо элемент, представлен вариант «создать элемент». В противном случае ничего не появляется. Ответ querie медленнее, чем рендеринг страницы, это я хочу решить с помощью сеанса, вызовов и асинхронных методов. – cleliodpaula

+0

@cleliodpaula Я не знаю особенностей вашего сценария, но то, что вы описываете, похоже на проблему с публикацией. Если вы не обновляете страницу, вы все еще видите, что элемент отображается, хотя и в более позднее время? Если нет, данные не попадают в клиенту. Если это не так, вы все равно можете решить проблему с заглушками клиентских методов, которые являются мгновенными. – mark

Смежные вопросы