2010-10-29 16 views
7

i actualmente utilizan la base de datos del cliente en una aplicación web HTML5 iPhone. En mi código tengo que comprobar si una fila está presente en la base de datos locales:HTML5 API de base de datos: petición síncrona

function isStarted(oDB) { 
var ret = null; 
oDB.query(sql,params,function(transaction,result) { 
    if(result.rows.length > 0) { 
     ret = true; 
    } else { 
     ret = false; 
    } 
}); 

return ret; 

}

Desafortunadamente el regreso de isStarted() se produce antes de la función de devolución de llamada y siempre me dan una "nula" valor. En el W3c spec podemos ver una "base de datos sincrónicos-api", pero ¿cómo puedo usarlo? ¿Hay algún truco para obtener el buen valor "ret" con los requets asincrónicos?

Gracias por su ayuda

+0

Me gusta esta pregunta. Establece el problema muy bien. –

Respuesta

8

para obtener un objeto implementar DatabaseSync usted tiene que llamar openDatabaseSync(...) en lugar de openDatabase(...). No sé sobre el iPhone, o cuál es el objeto oDB que tiene, pero de acuerdo con las especificaciones solo obtiene el método openDatabaseSync en un WebWorker y no en el navegador web normal window. Ciertamente, XMLHttpRequest ha demostrado que las operaciones sincrónicas de longitud potencial en el hilo de la interfaz de usuario no son una buena idea.

No se puede ejecutar el código asíncrono de forma síncrona, o viceversa. Para hacerlo, necesitaría funciones de nivel de idioma como subprocesos o co-rutinas que JavaScript no tiene. Debe salir de sus funciones y devolver el control al navegador para permitirle realizar la solicitud HTTP o la consulta de la base de datos, y devolverle la llamada a la función del manejador que le proporcionó.

Así que tendrá que volver a escribir el código 'al revés' para pasar las funciones de devolución de llamada en lugar de esperar valores devueltos, cada vez que haga algo que implique una base de datos IO.

function tellMeWhenIsStarted(oDB, callback) { 
    oDB.query(sql,params,function(transaction,result) { 
     callback(result.rows.length>0); 
    } 
}); 
+0

¿Está devolviendo la devolución de llamada o llamándola? –

+0

Lo estás llamando. –

8

yo soy el único que encuentra esta solicitud asincrónica ridícula? Además, parece que Safari implementa solo el modelo asíncrono en este momento ... Me pregunto cómo codificamos eficientemente así ...

Me gustaría cualquier enlace a una programación seria con el controlador async db.

-1

Tiene que bloquear la próxima ejecución cuando tenga la intención de recuperar los resultados de forma sincrónica. El precio que tiene que pagar es la UI que se bloquea durante la ejecución.

var ret = null; 
var finished = false; 

cfunction isStarted(oDB) { 
     oDB.query(sql,params,function(transaction,result) { 
       ret = result; 
       finished = true; 
     }); 

    while(!finished){ 
    ;//block next execution, while result is being fetched 
    } 
    return ret; 
} 
+1

Parece que esto no funciona, al menos en Chromium 17.0.963.56. También es lo que esperaría, ya que JS realmente no tiene Threads, entonces, no solo la UI está bloqueada durante el ciclo while, sino también la búsqueda real. – keppla

Cuestiones relacionadas