Как сделать методы Метеор синхронными?

Мне нужно, чтобы вызов метеора был синхронным, так что, когда вызов выполняется, код ожидает результата, чтобы он мог продолжить следующую строку кода на клиенте.

например:

clientFunction = function(){

    Meteor.call('serverFunction', function(err,result){})//<--so when this gets a result and    
                                                    //is stored in a session variable
    var doSomeThing = Session.get('whatever') <-- so that your able to use it here
}

Я пробовал делать цикл while, чтобы предотвратить что-либо, пока не будет возвращено значение но похоже, что он запускается после того, как клиентская функция, таким образом, бросила его на кончину

любая помощь будет воспринята

Ответы

Ответ 1

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

Лучшей практикой, я думаю, является использование доступной в настоящее время функции Meteor._wrapAsync, как описано, например, здесь: Meteor: вызов асинхронной функции внутри Meteor.method и возврат результата

Ниже описаны некоторые другие варианты: https://gist.github.com/possibilities/3443021


Обновление: Теперь метод называется Meteor.wrapAsync.

Ответ 2

Поместите код, который вы хотите запустить после завершения метода в обратном вызове метода. Это стандартно для любого асинхронного javascript.

clientFunction = function(){
  Meteor.call('serverFunction', function(err, result){
    if (err) {
      alert(err);
    } else {
      Session.set('whatever', result.whatever);
    }
  });
};

Это устанавливает значение переменной сеанса после вызова метода. Теперь вы используете реактивность Метеор для использования этой переменной:

Template.hello.helpers({
  myWhatever: function () {
    var whatever = Session.get('whatever');

    if (whatever) return whatever;

    return 'Loading whatever...';
  }
});

Ответ 3

Я следил за этим учебником и делал что-то вроде ниже

Это метод стороны на стороне метеорита

productIdResult:function(searchstring)
{
   {
      var skimlinks_query = Async.wrap(skimlinks.query);
      var title_val="title:\"electric bicycle\"  AND merchantCategory:*bikes*";                     
      var result = skimlinks_query({
                        searchFor: searchstring,
                        start:start,
                        rows:rows,
                        fq: "country:US"
                    });
      return result;
}

И я называю это от клиента вроде этого

Meteor.call('productIdResult',
            searchstring,
            function(error,resul)
            {
                arr[0]=resul.skimlinksProductAPI.products[0].title;
                $( "#op1").autocomplete({source:arr});

            }
);

Обратите внимание, что он не является синхронным, но вы получаете возвращаемое значение в обратном вызове