0
안녕하세요, 저는 각각 3 개의 테이블을 가지고 있습니다. 각 테이블은 서로의 자식입니다. 나는 방법은 첫 번째 방법은 실행관측 가능한 포크 참여 문제
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가 채워지지 않습니다. 누군가가 나를 안내하고 내가 여기서 잘못하고있는 전화를 할 수 있습니까? 나는 관찰 할 수있는 포크 조인을 사용했습니다.
observableBatch는 모든 db.executeSql 함수를 푸시하는 배열입니다. db.executeSql은 promise를 반환하기 때문에. 그래서 observableBatch.push (Observable.fromPromise (db.executeSql (..))) 패션 아래에서 해봤 다. 하지만 운이 없다 – jslearner07
@ jslearn07, 다시, forkJoin이 이미 호출되었을 때'observableBatch'에 약속을 추가하여 기다리지 않도록하겠다. –
그래서 내가 마지막 문장의 다음 Observable.forkJoin (observableBatch) 반환해야한다고 말하는 건가요? http://techqa.info/programming/question/35676451/observable.forkjoin-and-array-argument 예제를 따랐습니다. 가능한 경우 코드를 게시하십시오. – jslearner07