Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/30.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sqlite 可观察的fork-join问题_Sqlite_Angular_Reactjs_Observable_Ionic3 - Fatal编程技术网

Sqlite 可观察的fork-join问题

Sqlite 可观察的fork-join问题,sqlite,angular,reactjs,observable,ionic3,Sqlite,Angular,Reactjs,Observable,Ionic3,嗨,我有三张桌子,每一张都是另一张的孩子。我编写了一个从sqllite数据库获取数据的方法,如下所示 public downloadFromOfflineDB(db,testSO){ var observableBatch = []; observableBatch.push(db.executeSql("select * from TMP_AUD WHERE CRE_BY=? AND AUD_NUMBER=? ",

嗨,我有三张桌子,每一张都是另一张的孩子。我编写了一个从sqllite数据库获取数据的方法,如下所示

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);
    }

第一个方法正在执行,而第二个方法在第一个执行完成之前返回,我不会让我的对象testSO填充。有人能指导我并告诉我我做错了什么。我使用了observable fork Join。

看起来你调用的是
observable.forkJoin(observableBatch)
,只有一项-结果是
db.executeSql
。稍后添加更多项时,它不会影响
forkJoin

observeBatch是我将所有db.executeSql函数推送到的数组。因为db.executeSql返回承诺。所以我用下面的方式完成了observableBatch.push(Observable.fromPromise(db.executeSql(…))并尝试了。但是没有luck@jslearn07,再次说明,当forkJoin已经被调用时,您正在向
observatebatch
添加承诺,这样它就不会等待它们了。那么您的意思是说我应该在最后一条语句的末尾返回observatable.forkJoin(observatebatch)?我遵循这个例子。如果可能的话,请您发布代码。@jslearner07,实际上我是说,当您的下一个任务取决于上一个任务的结果时,您不能使用
forkJoin
。如果你在计算机上重现这个问题,或者类似的问题,那么我将为你解决。也许你所说的是对的。然而,我将我的实现改为这样,我为3个表保留了一个公共标识符。我使用这个公共标识符对3个表进行顺序查询,每个表都返回promise,最后我将通过比较父id在内部合并所有结果并创建json。这样我就得到了上面的impl工作。谢谢
 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.");                                                                                        
                    });

                 });
            });
        });
    }