I have a method called
fallbackToLocalDBfileOrLocalStorageDB
, which returns a promise and calls another method named getDBfileXHR
, also returning a promise.
In the code snippet provided, I am unsure whether I need to use 'resolve()' explicitly or if resolving getDBfileXHR
will automatically resolve
fallbackToLocalDBfileOrLocalStorageDB
.
Although I have commented out the then().catch()
parts, I am uncertain about whether I should remove them entirely.
fallbackToLocalDBfileOrLocalStorageDB() {
return new Promise(function (resolve, reject) {
if (this.storageService.get('prodata') === null) {
if (this.connectionStatus.f() !== 'online') {
} else {
this.sendErrorEmail("BL: online but falling back to local proDB", 10);
}
console.log('...falling back to local proBD.jsonp.');
return this.getDBfileXHR('proDB.jsonp');
// .then(function () {
// console.log('...falling back to local proBD.jsonp succeeded.');
// resolve();
// })
// .catch(, function () {
// console.log('...error, shit.');
// reject();
// });
EDIT showing the full nested functions, with partially fixed code:
import { Injectable } from '@angular/core';
...
export class UpdateProDB {
constructor(
) {
}
get() {
var debugOptionUseLocalDB = 0,
prodata = [],
serverAttempts = 0; return new Promise((resolve, reject) => {
if (debugOptionUseLocalDB) {
return this.fallbackToLocalDBfileOrLocalStorageDB();
}
if (this.connectionStatus.f() === 'online') {
console.log("Fetching DB from the server:");
return this.getDBfileXHR(this.dbUrl(), serverAttempts)
.then(function (data) {
console.log('-normal XHR request succeeded.');
resolve(data);
})
.catch((reason)=> {
if (typeof serverAttempts !== "undefined") serverAttempts++;
console.log('on passe dans le catch, serverAttempts = ', serverAttempts)
if (serverAttempts < 2) {
return this.getDBfileXHR(this.dbUrl(), serverAttempts)
.then(function () {
console.log('-basic XHR request succeeded.');
})
.catch(function (){
console.log("-basic XHR request failed, falling back to local DB file or localStorage DB...");
})
} else {
console.log("-basic XHR request failed, falling back to local DB file or localStorage DB...");
return this.fallbackToLocalDBfileOrLocalStorageDB()
.then((data)=>{
resolve(data);
})
.catch((reason)=> {
reject(reason);
});
}
});
});
}
getDBfileXHR(url, serverAttempts) {
return new Promise((resolve, reject) => {
var request = new XMLHttpRequest();
request.open("GET", url, true);
request.onload = ()=> {
if ( (request.readyState === 4) && ( (request.status >= 200 && request.status <= 299) || request.status === 304 || request.status === 0) ) {
console.log('-we get response '+request.status+' from XHR in getDBfileXHR');
var jsonText = request.responseText.replace("callback(", "").replace(");", "");
if (jsonText === '') {
console.error('-error');
reject({
status: request.status,
statusText: request.statusText
});
} else {
var parsedJson;
try {
parsedJson = JSON.parse(jsonText);
} catch (e) {
resolve(request.response);
}
}
};
request.onerror = ()=> {
reject({
status: request.status,
statusText: request.statusText
});
};
console.log("sending request.send()");
request.send();
});
}
fallbackToLocalDBfileOrLocalStorageDB() {
return new Promise((resolve, reject) => {
if (this.storageService.get('prodata') === null) {
if (this.connectionStatus.f() !== 'online') {
} else {
this.sendErrorEmail("BL: online but falling back to local proDB", 10);
}
console.log('...falling back to local proBD.jsonp.');
return this.getDBfileXHR('proDB.jsonp', undefined)
.then(function (data) {
console.log('...falling back to local proBD.jsonp succeeded.');
resolve(data);
})
.catch((reason)=> {
console.log('...error, shit.');
reject(reason);
});
} else {
resolve();
}
});
}