2017-10-19 9 views
0

Le code est écrit en Angularjs dans le cadre ionique. Je pense que les gens d'Angular peuvent aussi répondre à cette question. Lorsque j'appelle cette fonction, l'alerte affiche les tableaux vides "[]" et "indéfini" respectivement. Je pense que cela se produit en raison de la nature asynchrone de JavaScript. Je veux que cette fonction s'exécute de manière synchrone.code synchro en angularjs

/*This is the constructor */ 
constructor(public navCtrl: NavController, public SP: SqliteProvider) { 
} 
/*my function*/ 
getCustomerById() 
{ 
    this.SP.getCustomerById(this.id); 
    this.customerById = this.SP.customerById; 
     alert(this.SP.customerById); 
     alert(this.SP.customerById[0]); 

} 

/* La fonction SqliteProvider */

getCustomerById(cid) 
{ 
    this.customerById = []; 
    this.sqlite.create({ 
     name: this.dbName, 
     location: 'default' 
    }) 
     .then((db: SQLiteObject) =>{ 

      db.executeSql('SELECT * FROM `customers` WHERE id= ?', [cid]) 
       .then(result => { 

         var json = JSON.parse(result.rows.item(0).json); 
         //alert(json); 
         this.customerById.push(json); 
         // alert(JSON.stringify(this.customerObject)); 
       }) 
       .catch(e => console.log(e)); 
     }) 
     .catch(e => console.log(e)); 
} 
+0

'Je veux que cette fonction à exécuter synchronously' <= ** non, vous ne ** Vous ne savez pas comment utiliser correctement les appels asynchrones.. Lisez la réponse du lien dupliqué ci-dessus, en particulier l'en-tête nommé ** ES2015 +: promesses avec then() ** qui est similaire à ce que renvoie sqllite.create' et 'db.executeSql'. Vous devez renvoyer une promesse à votre appelant afin que l'appelant (getCustomerById) puisse s'y abonner. – Igor

Répondre

0

Pouvez-vous poster le code de la méthode SqliteProvider? Je suis assez sûr qu'il renvoie un Promise ou un Observable. La chose avec Promises et Observables est que l'appelant doit attendre jusqu'à ce qu'ils aient fini leur travail et ensuite procéder, dans une méthode de fermeture.

Alors vous devez faire quelque chose comme ce qui suit:

this.SP.getCustomerById(this.id).then((customer) => { 
    this.SP.customerById = customer; 
    alert(this.SP.customerById); 
}, error => {console.log(error)}); 

Notez que dans le cas où votre méthode SqliteProvider retourne un Observable et non une Promise, vous devrez modifier le code en conséquence (ajouter abonnez-vous au lieu de puis)

Vous pouvez lire un tutoriel génial pour les promesses here et pour Observabl es here.

EDIT méthode après affiché:

Voir aussi this answer. Il n'est en fait pas nécessaire d'avoir une variable interne customerById. En fait, ce n'est pas une bonne pratique, puisque votre méthode devrait seulement récupérer le client, ne pas l'assigner à une variable. Vous devez modifier votre code comme suit:

getCustomerById(cid) 
{ 
    return 
    this.sqlite.create({ 
     name: this.dbName, 
     location: 'default' 
    }) 
     .then((db: SQLiteObject) =>{ 
      return 
      db.executeSql('SELECT * FROM `customers` WHERE id= ?', [cid]) 
       .then(result => { 
        return JSON.parse(result.rows.item(0).json); 
       }) 
       .catch(e => console.log(e)); 
     }) 
     .catch(e => console.log(e)); 
} 
+0

J'ai ajouté la fonction dans la description @paul –

+0

Voir la réponse éditée –