2017-05-22 18 views
0

こんにちは私は3つのテーブルを持ち、それぞれが別のテーブルの子です。私は、この方法は、第1の方法が実行されている観測可能なフォークジョインの問題

public getFiles(testSO) { 

     return Observable.create(observer => { 

      this.platform.ready().then(() => { 
       this.sqlite.create({ 
        name: 'offline.db', 
        location: 'default' 
       }).then((db: SQLiteObject) => { 
        this.downloadFromOfflineDB(db, testSO).subscribe(c => { 
         observer.next(c[0]);//This is undefined 
         observer.complete(); 
        }, 
        error => { 

         observer.error("An error occurred sync files.");                       
        }); 

       }); 
      }); 
     }); 
    } 

を完了するためにすべての呼び出しを待っていない下にある、ここで

public downloadFromOfflineDB(db,testSO){ 
      var observableBatch = []; 
      observableBatch.push(db.executeSql("select * from TMP_AUD WHERE CRE_BY=? AND AUD_NUMBER=? ", 
         [localStorage.getItem("user_name"), testSO.auditNumber]).then(
         response => { 
          this._util.logData('In downloadPendingInstancesForSyncFromOfflineDB- folder'+response.rows.length+'ID= '+response.rows.item(0).FLD_NUMBER); 
          if (response && response.rows && response.rows.length > 0) { 
           if (response && response.rows && response.rows.length > 0) { 
            var FLD_NUMBER = response.rows.item(0).FLD_NUMBER; 
            var folderArray = [] 
            observableBatch.push(db.executeSql("select * from TMP_FOLDER WHERE CRE_BY=? AND FLD_NUMBER=? ", 
             [localStorage.getItem("user_name"), FLD_NUMBER]).then(
             a => { 
               this._util.logData('In downloadPendingInstancesForSyncFromOfflineDB-TMP_FOLDER'+a.rows.length); 
              if (a && a.rows && a.rows.length > 0) { 
               for (let i = 0; i < a.rows.length; i++) { 
                var folderObj = { 
                 folderName: a.rows.item(i).FLD_NAME, 
                 files:[] 
                } 

                var FLD_NAME = a.rows.item(i).FLD_NAME 
                this._util.logData('In downloadPendingInstancesForSyncFromOfflineDB-TMP_FOLDER '+FLD_NAME); 
                observableBatch.push(db.executeSql("select * from TMP_FILES WHERE CRE_BY=? AND FLD_NAME=? ", 
                 [localStorage.getItem("user_name"), FLD_NAME]).then(
                 b => { 
                   this._util.logData('In downloadPendingInstancesForSyncFromOfflineDB-TMP_FILES'+b.rows.length); 
                  var fileArray = []; 
                  if (b && b.rows && b.rows.length > 0) { 
                   for (let j = 0; j < b.rows.length; j++) { 
                    var fileSO = { 
                     compliance: b.rows.item(j).COMPLIANCE, 
                     remarks: b.rows.item(j).REMARKS, 
                     fileName: b.rows.item(j).FILE_NAME, 
                     title: b.rows.item(j).TITLE 

                     } 

                    ); 
                    fileArray.push(fileSO); 
                   }} 
                  folderObj.files=fileArray; 
                  }).catch(
                      e => { 
                       this._util.logData('For sync error'+JSON.stringify(e)); 
                       return Observable.throw("An error occurred during sync"); 
                      }) 
                  ); 

                 folderArray.push(folderObj); 
               }} 

             }).catch(
                e => { 
                 this._util.logData('For sync error'+JSON.stringify(e)); 
                 return Observable.throw("An error occurred during sync"); 
                }) 
             ); 
           } 


          } 
          testSO.folderArray = folderArray; 
          this._util.logData('Candidate for selected for sync' + JSON.stringify(testSO)); 

         }) 
      ); 
     return Observable.forkJoin(observableBatch); 
    } 

問題を次のようにsqllite DBから取得するために方法を書いた第二の方法が戻る前にしばらく最初の実行が完了し、オブジェクトtestSOが読み込まれていません。誰かが私を案内して、私がここで間違っていることを私に電話してもらえますか?私は観察可能なフォーク参加を使用しました。

答えて

0

Observable.forkJoin(observableBatch)には1つのアイテム(結果:db.executeSql)しかないようです。後でアイテムを追加すると、forkJoinには影響しません。

+0

observableBatchは、すべてのdb.executeSql関数をプッシュしている配列です。 db.executeSqlは約束を返します。だから、私はobservableBatch.pushファッション(Observable.fromPromise(db.executeSql(..))ファッションの下でそれをやってみました。しかし、運がない – jslearner07

+0

@ jslearn07もう一度、forkJoinがすでに呼び出されているので、それを待たないで 'observableBatch'に約束を追加します。 –

+0

だから私は最後のステートメントの時にObservable.forkJoin(observableBatch)を返さなければならないと言っていますか?私はこの例に従っています。http://techqa.info/programming/question/35676451/observable.forkjoin-and-array-argument可能であれば、コードを投稿してください。 – jslearner07

関連する問題