2016-10-19 12 views
1

私はIonic2/Typescriptを使用しています。Javascript 'Promise'同期をとる方法

私は2つのPromiseを持っています。これは、私が続行する(つまり同期する)前に完了したいものです。だから、私はPromise.all(...)に2つの関数を呼び、resolveが呼び出される前にそれらの関数が完了することを期待しています。私は次のコードを持っている

refreshChats 
populateChat Object {...} 
openDatabase2: resolve 
refreshChats return this.chats.length = 1 

どれが上の助言:私のコンソール出力から

public openDatabase(): Promise<Array<Message>> { 
    let promise: Promise<Array<Message>> = new Promise<Array<Message>>(resolve => { 
     if (false && this.database && this.database != null) { 
      Promise.all([this.refreshChats(this.database), this.refreshMessages(this.database)]).then(() => { 
       console.log('openDatabase1: resolve'); 
       resolve(this.messages); 
      }); 
     } else { 
      this.database = new SQLite(); 
      this.database.openDatabase({ 
       name: "data.db", 
       location: "default" 
      }).then(() => { 
       Promise.all([this.refreshChats(this.database), this.refreshMessages(this.database)]).then(() => { 
        console.log('openDatabase2: resolve'); 
        resolve(this.messages); 
       }); 
      }, (error) => { 
       console.log("OPEN ERROR: ", error); 
      }); 
     } 
    }); 
    return promise; 
} 

public refreshChats(db: any): Promise<any> { 
    console.log('refreshChats '); 
    return db.executeSql("SELECT * FROM chats", []) 
     .then((chatData) => { 
      let promises: Array<any> = []; 
      this.chats = []; 
      if (chatData.rows.length > 0) { 
       for (var i = 0; i < chatData.rows.length; i++) { 
        promises.push(this.populateChat(db, chatData.rows.item(i))); 
       } 
      } 
      Promise.all(promises).then(() => { 
       console.log('refreshChats return this.chats.length = ' + this.chats.length); 
       return this.chats; 
      }); 
     }) 
     .catch(error => { 
      console.log("ERROR REFRESHING CHATS: " + JSON.stringify(error)); 
      console.log(error); 
     }); 
} 

を、あなたはresolveがチャットが終了する前に、さわやかに呼び出されていることがわかりますどのように私はPromisesを構造化すべきですか?

答えて

1

あなたは内側の約束のコールバックから新しい約束を返却する必要があります。

public openDatabase(): Promise<Array<Message>> { 
    let promise: Promise<Array<Message>> = new Promise<Array<Message>>(resolve => { 
     if (false && this.database && this.database != null) { 
      return Promise.all([this.refreshChats(this.database), this.refreshMessages(this.database)]).then(() => { 
       console.log('openDatabase1: resolve'); 
       resolve(this.messages); 
      }); 
     } else { 
      this.database = new SQLite(); 
      return this.database.openDatabase({ 
       name: "data.db", 
       location: "default" 
      }).then(() => { 
       return Promise.all([this.refreshChats(this.database), this.refreshMessages(this.database)]).then(() => { 
        console.log('openDatabase2: resolve'); 
        resolve(this.messages); 
       }); 
      }, (error) => { 
       console.log("OPEN ERROR: ", error); 
      }); 
     } 
    }); 
    return promise; 
} 

public refreshChats(db: any): Promise<any> { 
    console.log('refreshChats '); 
    return db.executeSql("SELECT * FROM chats", []) 
     .then((chatData) => { 
      let promises: Array<any> = []; 
      this.chats = []; 
      if (chatData.rows.length > 0) { 
       for (var i = 0; i < chatData.rows.length; i++) { 
        promises.push(this.populateChat(db, chatData.rows.item(i))); 
       } 
      } 
      return Promise.all(promises).then(() => { 
       console.log('refreshChats return this.chats.length = ' + this.chats.length); 
       return this.chats; 
      }); 
     }) 
     .catch(error => { 
      console.log("ERROR REFRESHING CHATS: " + JSON.stringify(error)); 
      console.log(error); 
     }); 
} 

注意、return Promise.allreturn this.database.openDatabaseを。

関連する問題