En realidad, no puede hacer que las funciones asincrónicas parezcan sincrónicas sin algo como hilos / fibras / corutinas. Node.js no tiene ninguno de estos expuestos a JavaScript.
ACTUALIZACIÓN: Los generadores de ES6 y los asíncronos / en espera de ES7 (ambos esencialmente corutinas) hacen posible este tipo de cosas y debería considerar usarlas. Ver EDIT2 a continuación.
Las funciones asincrónicas suelen tener algún tipo de argumento de devolución de llamada, que es donde desea colocar cualquier código que deba ejecutarse después de que se haya completado. Por ejemplo, su función “foo” tendría un argumento de devolución de llamada:
foo(function() { bar(); })
Si no es necesario pasar argumentos, esto podría simplificarse a:
- ¿Qué significa f (x) en una ecuación?
- ¿Qué es una función anónima en JavaScript?
- ¿Cuál es el nombre del conjunto obtenido por la multiplicación puntual de un conjunto finito de funciones?
- Dadas dos distribuciones de probabilidad, F [x] y G [x], es la distribución creada al extraer aleatoriamente el 50% del tiempo de F y el 50% del tiempo de G igual a (F (x) + G (x)) / 2?
- ¿Cuáles son las mejores funciones en Bloomberg?
foo(bar);
La implementación de “foo” podría verse así:
function foo(callback) { doAsyncStuff(function(result) { callback(); }); // or simply "doAsyncStuff(callback);" but "result" would get passed to the callback }
En el caso de llamar a “foo (bar)”, el argumento de “devolución de llamada” dentro de esta función se refiere a la función “bar”. Se llama cada vez que se completa la función doAsyncStuff.
EDITAR: node-fibres expone la fibra primitiva en Node.js
EDIT2: ES6 tiene generadores, que se pueden usar junto con las promesas de usar construcciones de flujo de control tradicionales (if, for, while, try / catch, etc.) de forma natural con funciones asincrónicas.
Ver Generadores vs Fibras petkaantonov / bluebird kriskowal / q tj / co o http://taskjs.org/
var add2AsyncThings = Bluebird.coroutine(function *() { try { var a = yield someAsyncFunction(); var b = yield anotherAsyncFunction(); return a + b; } catch(e) { // rejected promise from either function is caught here } })
ES7 probablemente tendrá funciones “asíncronas” y la sintaxis “espera” para hacer esto aún más fácil:
asyn function add2AsyncThings() { try { var a = await someAsyncFunction(); var b = await anotherAsyncFunction(); return a + b; } catch(e) { // rejected promise from either function is caught here } })
Consulte las funciones asíncronas de ES7 o lukehoban / ecmascript-asyncawait
Tanto los generadores como async / await pueden funcionar en navegadores o Node.js hoy a través de un transpilador como Babel, Regenerator o Traceur.