2017-10-19 9 views
0

このコードは、IonicフレームワークのAngularjsで書かれています。 Angularの背景にいる人もこの質問に答えることができると思います。anglejsの同期コード

この関数を呼び出すと、空の配列「[]」と「未定義」がそれぞれ表示されます。私はこれがJavaScriptの非同期性の原因であると思います。この関数を同期して実行します。

/*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]); 

} 

/* 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

'私は、この関数はsynchronously'を実行したい<= **いいえ、そうでない**あなただけ正しく非同期呼び出しを使用する方法がわかりません。上記の重複するリンクの答え、特に** ES2015 +という見出しを読んでください: 'sqllite.create'と' db.executeSql'が返すものに似ているthen()**で約束します。呼び出し元(getCustomerById)がそれにサブスクライブできるように、呼び出し元に約束を返す必要があります。 – Igor

答えて

0

あなたはSqliteProviderメソッドからコードを投稿することができますか? 私はそれがPromiseまたはObservableのいずれかを返すと確信しています。

プロミスとオブザーバブルのものは、呼び出し元がジョブを終了して終了するまでクロージャメソッドで処理を続行する必要があることです。

ですから、次のように実行する必要があります。あなたのSqliteProvider方法が観察可能なく約束を返す場合には、それに応じてコードを変更する必要があること

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

注(を追加代わりのが、その後

あなたが約束hereとObservablのためのための素晴らしいチュートリアルを読むことができます購読しますes here

EDIT後投稿方法:

this answer参照してください。 実際には、内部のcustomerById変数を持つ必要はありません。 実際には、あなたのメソッドは顧客にのみ検索され、変数には割り当てられないので、良い習慣ではありません。あなたは、次のようにコードを変更する必要があり :

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

@ paulの説明に関数を追加しました –

+0

編集された答えを見る –

関連する問題