methods meteor call sync synchronous

methods - ¿Cómo hacer que los métodos de Meteor sean sincrónicos?



call sync (3)

Necesito una forma para que una llamada de meteorito sea sincrónica, de modo que cuando se ejecuta una llamada, el código espere a que se haga un resultado para que pueda continuar a la siguiente línea de código en el cliente.

por ejemplo:

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 }

He intentado hacer un bucle while para evitar que ocurra algo hasta que se devuelva un valor, pero parece que se ejecuta después de que ClientFunction lo arroje a su desaparición.

cualquier ayuda sería apreciada


Coloque el código que desea ejecutar después de que el método se complete en la devolución de llamada del método. Esto es estándar para cualquier javascript asíncrono.

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

Eso establece el valor de la variable de sesión una vez que se devuelve la llamada de método. Ahora usas la reactividad de Meteor para usar esa variable:

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


Esta es una pregunta muy común, que se formula en varias formas y formas. La mayoría de las personas no se dan cuenta cuando están haciendo llamadas asíncronas. Sin embargo, la solución siempre es la misma: envuelva su código de método en el servidor en una fibra o use un futuro.

La mejor práctica, creo, es usar la función Meteor._wrapAsync actualmente disponible como se describe, por ejemplo, aquí: Meteor: llamar a una función asíncrona dentro de un método Meteor y devolver el resultado

Algunas otras opciones se describen aquí: https://gist.github.com/possibilities/3443021

Actualización: el método ahora se llama Meteor.wrapAsync .


Seguí this tutorial y hago algo como abajo

Este es un método del lado del servidor de meteoros.

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; }

Y lo llamo de cliente así.

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

Tenga en cuenta que no es síncrono, pero obtiene el valor de retorno en la devolución de llamada