Le rappel, la valeur de retour et HTML5 fonction executeSql
J'ai un gros problème. Je sais que c'est à propos de rappel, la fermeture, mais je ne sais pas comment résoudre le problème. Voici mon code
$.Model.extend('Article',
{
findAll : function(params, success, error){
var result = []
db.transaction(function(tx) {
tx.executeSql('select * from contents', [],function(tx, rs) {
for(var i=0; i<rs.rows.length; i++) {
var row = rs.rows.item(i)
result[i] = {
id: row['id'],
title: row['title'],
body: row['body']
}
}
})
})
//here result is undefined
alert(result)
return result
}
})
//undefined
var view = Article.findAll
Je sais que executeSql est asynchrone fonction, mais je ne sais pas comment faire pour sauvegarder et retourner le résultat de executeSql. J'utilise javascript mvc et HTML en mode hors connexion de la base de données.
Merci pour votre aide
Je Google avait "Javascript MVC" et a trouvé à la bibliothèque, mais ne peut pas trouver quoi que ce soit dans le JavaScript MVC docs sur 'executeSql'. Si vous avez des docs à portée de main, vous devriez vérifier pour voir si il y a une façon de faire de la tx.méthode executeSql exécuter de manière synchrone au lieu de l'asynchrone.
Je sais qu'il existe aussi la méthode synchrone pour executeSql, mais safari et les autres navigateurs basés sur webkit en charge uniquement asynchrone. Le Code ci-dessous fonctionne parfaitement, merci les gars
Fonctionne parfaitement? On pourrait presque dire que c'était la "réponse" ? 😉
L'API synchrones s'applique uniquement (dans la spec) pour des web workers, pas de la fenêtre de l'objet, ce qui n'est pas une possibilité. dev.w3.org/html5/webdatabase/#databases
Je sais qu'il existe aussi la méthode synchrone pour executeSql, mais safari et les autres navigateurs basés sur webkit en charge uniquement asynchrone. Le Code ci-dessous fonctionne parfaitement, merci les gars
Fonctionne parfaitement? On pourrait presque dire que c'était la "réponse" ? 😉
L'API synchrones s'applique uniquement (dans la spec) pour des web workers, pas de la fenêtre de l'objet, ce qui n'est pas une possibilité. dev.w3.org/html5/webdatabase/#databases
OriginalL'auteur Tibor | 2009-12-13
Vous devez vous connecter pour publier un commentaire.
Du W3C web de la base de données spec parle de soutien pour les deux Asynchrone et Synchrone opérations de base de données. (Voir 4.3 et 4.4)
Si vous ne pouvez pas utiliser un synchrone de la mise en œuvre, alors vous pourriez envisager de l'approche du problème comme ceci à la place:
OriginalL'auteur Charlie Brown
J'ai les mêmes problèmes, mais vous pourriez vouloir utiliser cette petite bibliothèque d'encapsulation qui rend la vie plus facile 😉
http://github.com/grosser/arjs
OriginalL'auteur grosser
J'ai eu le même problème, surtout sur mobile des projets de développement. J'ai créé une bibliothèque qui élimine la nécessité pour les rappels:
http://code.google.com/p/proto-q/
De ça, mon code est plus facile à résoudre, à maintenir et à améliorer.
J'ai ajouté le support d'AJAX, web workers, injection de script, et l'Api de stockage. J'espère que cela aide.
OriginalL'auteur AutoSponge
Votre essayez d'utiliser le résultat de manière synchrone, c'est-à votre accès à résultat avant sa définies (en fait dans votre exemple de code ses pas indéfini, de son un tableau vide) bien que j'attends c'est parce que vous vous étiez déplacé la déclaration de sa position initiale, à essayer de comprendre ce qui se passait.
Essayer cette modifiés exemple:-
Article.findAll() est maintenant une fonction d'asynchrone, et son rappel (fermeture) reçoit les résultats.
OriginalL'auteur Austin France