Как сделать методы Метеор синхронными?
Мне нужно, чтобы вызов метеора был синхронным, так что, когда вызов выполняется, код ожидает результата, чтобы он мог продолжить следующую строку кода на клиенте.
например:
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});
}
);
Обратите внимание, что он не является синхронным, но вы получаете возвращаемое значение в обратном вызове