then sincronas promesas node funciones entre diferencia await async anidadas javascript iphone design-patterns safari mobile-safari

sincronas - Patrón para envolver una función Asynchronous JavaScript para que sea sincrónico



promise javascript (7)

Estamos usando GWT RPC que también tiene una API asíncrona. La solución que estamos utilizando actualmente para realizar varias llamadas asincrónicas en serie es el encadenamiento de llamadas:

callA(function(resultA) { callB(resultA, function(resultB) { callC(); //etc. }); });

Este enfoque anidado logra lo que desea, pero es detallado y difícil de leer para los recién llegados. Uno de los enfoques que hemos investigado es agregar las llamadas que necesitamos hacer a una pila y ejecutarlas en orden:

callStack = [ callA(), callB(), callC() ]; callStack.execute();

Entonces la pila de llamadas se las arreglaría:

  1. Invocando las llamadas en serie (es decir, el cableado en el primer ejemplo)
  2. Pasar el resultado de una llamada a la siguiente.

Sin embargo, dado que Java no tiene referencias de funciones, cada llamada en la pila de llamadas requeriría una clase anónima, por lo que nos quedamos cortos de dicha solución. Sin embargo, puede tener más éxito en javascript.

¡Buena suerte!

Estoy trabajando con una API de JavaScript donde la mayoría de las funciones son asincrónicas. La API es la API de base de datos WebKit JavaScript, que es un enlace a un subconjunto de funciones para manipular bases de datos SQLite3. Entiendo la decisión de diseño para sincronizar las cosas y no bloquear y proporcionar una interfaz de usuario receptiva. En mi situación, sé que mi uso de las llamadas API asíncronas se ejecutará rápidamente. Dado que este es el caso, me gustaría proporcionar a mis desarrolladores una API de contenedor más limpia y fácil de usar que obliga a las llamadas sincrónicas.

Aquí está la llamada asincrónica

db.executeSql(sqlStatement, function(result) { // do something with result });

Y esto es lo que me gustaría poder hacer

var result = dbWrapper.executeSql(sqlStatement); // do something with result

¿Hay un patrón de diseño / forma de hacer esto? Se prefiere un ejemplo de código escrito o vinculado al código. La plataforma de destino / broswer es Mobile Safari en el iPhone.

Gracias


Lo sentimos, JavaScript no proporciona las primitivas del lenguaje (por ejemplo, hilos o coroutines) para que las cosas asincrónicas actúen de forma síncrona o viceversa.

Por lo general * solo obtiene un hilo de ejecución, por lo que no puede obtener una devolución de llamada de un temporizador o XMLHttpRequest Readystatechange hasta que la pila de llamadas que conducen a la creación de la solicitud se haya descifrado por completo.

En resumen, no puedes realmente hacerlo; el enfoque con cierres anidados en la página WebKit que ha vinculado es la única forma que conozco de hacer que el código sea legible en esta situación.

*: excepto en algunas situaciones poco claras que no lo ayudarían y generalmente se consideran errores


si está utilizando jQuery Ajax: $ .ajax ()

puede establecer el atributo de asynch en falso, y luego tendrá una solicitud de ajax de sincronización para el servidor.


Puedes probar algo como:

function synch() { var done = false; var returnVal = undefined; // asynch takes a callback method // that is called when done asynch(function(data) { returnVal = data; done = true; }); while (done == false) {}; return returnVal; }

Pero eso puede congelar su navegador por la duración del método de asincronización ...

O eche un vistazo a JavaScript narrativo: JavaScript narrativo es una pequeña extensión del lenguaje JavaScript que habilita las capacidades de bloqueo para devoluciones de eventos de eventos asíncronos. Esto hace que el código asincrónico sea refrescantemente legible y comprensible.

http://neilmix.com/narrativejs/doc/index.html

Micro


Esto realmente no implementa la operación síncrona de la consulta db, pero esta fue mi solución para una administración sencilla. Básicamente use la función de llamada como la función de devolución de llamada y pruebe el argumento de resultados. Si la función recibe resultados, los analiza, si no, se envía a sí mismo como una devolución de llamada al método de consulta.

render: function(queryResults){ if (typeof queryResults != ''undefined''){ console.log(''Query completed!''); //do what you will with the results (check for query errors here) } else { console.log(''Beginning query...''); this.db.read(this.render); //db.read is my wrapper method for the sql db, and I''m sending this render method as the callback. } }


StratifiedJS te permite hacer exactamente eso.

Incluso hay un artículo sobre cómo aplicarlo en el almacenamiento del navegador: http://onilabs.com/blog/stratifying-asynchronous-storage

Y esta es la biblioteca Stratified JavaScript que usa https://gist.github.com/613526

El ejemplo es como:

var db = require("webdatabase").openDatabase("CandyDB", ...); try { var kids = db.executeSql("SELECT * FROM kids").rows; db.executeSql("INSERT INTO kids (name) VALUES (:name);", [kids[0]]); alert("done"); } catch(e) { alert("something went wrong"); }

tal vez un poco tarde, pero la tecnología no existía en ese entonces;)


No estoy seguro de si este es el lugar correcto, pero estoy aquí buscando respuestas para hacer llamadas sincrónicas en Firefox. la solución sería eliminar la devolución de llamada onreadystatechange y hacer una llamada directa. Esto es lo que encontré y mi solución llamada sincrónica con servicio de descanso