javascript - termine - Espere a que finalice la tarea asíncrona
funciones asincronas jquery (2)
Estoy interactuando con una biblioteca de JavaScript de terceros donde algunas llamadas a funciones son asincrónicas. En lugar de trabajar con la lógica asíncrona en mi aplicación, prefiero escribir envoltorios sincrónicos en esas llamadas asincrónicas. Lo sé, lo sé, es un diseño terrible, pero este es un proyecto de demostración con muchas posibilidades de ser reescrito por completo. Necesito algo para mostrarle al equipo el concepto, sin tener que preocuparme realmente por el rendimiento.
Esto es lo que quiero hacer:
function sync_call(input) {
var value;
// Assume the async call always succeed
async_call(input, function(result) {value = result;} );
return value;
}
Probé el jQuery diferido y prometedor, pero parece apuntar al patrón de diseño asincrónico. Quiero usar el patrón síncrono en mi código.
¿Qué le parece llamar a una función desde su devolución de llamada en lugar de devolver un valor en sync_call ()?
function sync_call(input) {
var value;
// Assume the async call always succeed
async_call(input, function(result) {
value = result;
use_value(value);
} );
}
Esto nunca funcionará , porque la máquina virtual JS se ha movido desde esa llamada async y devuelto el valor, que aún no ha configurado.
No intentes luchar contra lo que es natural y el comportamiento del lenguaje incorporado. Debe usar una técnica de devolución de llamada o una promesa.
function f(input, callback) {
var value;
// Assume the async call always succeed
async_call(input, function(result) { callback(result) };
}
La otra opción es usar una promesa, eche un vistazo a Q De esta manera, devuelve una promesa, y luego adjunta un oyente, que es básicamente lo mismo que una devolución de llamada. Cuando la promesa se resuelva, se disparará.