2016-11-21 14 views
2

私のケースでは、customerServiceで得意先リストを取得して、コンポーネントに返品する必要があります。誰でもgetCustomersListメソッドを書き直して助けてください。角度2の約束は、ネストされた約束を解決するのを待っていませんか?

import { Injectable } from '@angular/core'; 
import { SQLite } from 'ionic-native'; 

@Injectable() 
export class CustomerService { 
    private sDBName:string; 
    private db; 
    private isDBExist:boolean = false; 

    constructor() {} 

    setDBName(sDBName:string) { 
     this.sDBName = sDBName; 
    } 

    connect():Promise<any> {   
     this.db = new SQLite(); 
     return this.db.openDatabase({ 
      name: this.sDBName, 
      location: 'default' 
     }); 
    } 
    getCustomersList():Promise<any> { 
     return Promise.resolve(()=>{    
      return this.connect().then(()=>{     
       this.isDBExist = true; 
       let sql = 'SELECT * FROM customer ORDER BY customer_id DESC LIMIT 10'; 
       return this.db.executeSql(sql, {}).then((result)=>{ 
        let customers = [];    
        for(let i=0; i<result.rows.length; i++) { 
         customers.push(result.rows.item(i)); 
        } 
        return customers; 
       },(err)=>{ 
        this.debug('Unable to select customers', err); 
        return []; 
       }); 
      },(err)=>{ 
       this.debug('Unable to open database', err); 
       return []; 
      }); 
     }); 
    } 
} 

答えて

3

あなたは絶対に不自然な方法でプロミスを使用します。コールバック地獄を取り除くための約束が作成されています。約束は非同期コードの複雑さを減らすことになっていますが、あなたがやっていることはまさにコールバック地獄への道です。

プロミスの基準に従って作業するために、私は少し関数を書き直しました。これは、ボックスソリューションの外に動作していないが、あなたはどんなplunkerをご提供していないかもしれないので、これは単なる概念である:

getCustomersList(): Promise<any> { 
    return this.connect() 
     .catch(err => throw new Error('Unable to open database', err)) 
     .then(() => { 
      this.isDBExist = true; 
      return this.db.executeSql('SELECT * FROM customer ORDER BY customer_id DESC LIMIT 10', {}) 
     }) 
     .catch('cannot execute query') 
     .then(result => result.rows.map(row => row.item(i))) 
     .catch(err => { 
      this.debug('Unable to select customers', err); 
      return []; 
     }); 
} 

私は本当に、データベースへの接続を信じて、この時に行われるべきではありませんあなたのデータベース層になるいくつかの共通のデータベースサービスに置きます。理想的には、この関数を呼び出すと、データベースはすでに接続されているはずです。/エラーは既にスローされているはずです。だから、アーキテクチャについて考える時間を増やしてください。

+0

この返品はまだ機能しません。最初の接続約束の中にもう1つの約束が存在するため、これは何も返されません。 return文は内側の約束が完了するのを待つことはありません – Sundar

+1

@Sundarは約束についてもっと学びます。 '.then'関数が別の約束を返すとき、それは解決されるまで待ってから次の' .then'を実行します – smnbbrv

1

あなたの方法は顧客リスト、または顧客リストを照会機能を返すgetCustomersListべきでしょうか?それが前者の場合は、これが行く方法です:

getCustomersList(): Promise<any> { 
    return this.connect().then(() => { 
     this.isDBExist = true; 
     let sql = 'SELECT * FROM customer ORDER BY customer_id DESC LIMIT 10'; 
     return this.db.executeSql(sql, {}).then((result) => { 
      let customers = []; 
      for (let i = 0; i < result.rows.length; i++) { 
       customers.push(result.rows.item(i)); 
      } 
      return customers; 
     }, (err) => { 
      this.debug('Unable to select customers', err); 
      return []; 
     }); 
    }, (err) => { 
     this.debug('Unable to open database', err); 
     return []; 
    }) 
} 
関連する問題