js 함수에서 거부 된 약속을 반환해야합니다. 나는 당신이 볼 수 있듯이 $ q를 사용하고 있습니다. 그러나 그것은 효과가 없습니다. 기능 getDBfileXHR에서 함수가 0을 반환하는 경우 함수에 오류가 전달됩니다.
, 약속 getDBfileXHRdeferred 함수getDBfileXHR
의 오류 케이스에 전달하고 fallbackToLocalDBfileOrLocalStorageDB을 실행하는 데 나는 것
getDBfileXHRdeferred.reject()
를 사용 거부(). 그러나 그것은 효과가 없습니다.
구문 오류가 있습니까? 나는 약간 새로운 약속이다.
감사
this.get = function() {
var debugOptionUseLocalDB = 0,
prodata = [],
serverAttempts = 0;
if (debugOptionUseLocalDB) {
return fallbackToLocalDBfileOrLocalStorageDB();
}
if (connectionStatus.f() === 'online') {
console.log("Fetching DB from the server:");
return getDBfileXHR(dbUrl(), serverAttempts)
.then(function() { // success
console.log('-basic XHR request succeeded.');
return dbReadyDeferred.promise;
}, function() { // error
console.log("-basic XHR request failed, falling back to local DB file or localStorage DB...");
return fallbackToLocalDBfileOrLocalStorageDB();
});
}
}
function getDBfileXHR(url, serverAttempts) {
var getDBfileXHRdeferred = $q.defer(),
request = new XMLHttpRequest();
if (typeof serverAttempts !== "undefined") serverAttempts++;
request.open("GET", url, true); //3rd parameter is sync/async
request.timeout = 2000;
request.onreadystatechange = function() { // Call a function when the state changes.
if ((request.readyState === 4) && (request.status === 200 || 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 : request.status = ' + request.status + ', but jsonText is empty for url=' + url);
if (serverAttempts <= 2){
sendErrorEmail("BL: jsonText is empty, trying to reach server another time", 11);
getDBfileXHR(url, serverAttempts);
return;
} else {
sendErrorEmail("BL: jsonText is empty and attempted to reach server more than twice", 14);
var alertPopup = $ionicPopup.alert({
title: 'Error '+"11, jsonText is empty",
template: "Sorry for the inconvenience, a warning email has been sent to the developpers, the app is going to restart.",
buttons: [{
text:'OK',
type: 'button-light'
}]
});
getDBfileXHRdeferred.reject();
}
} else {
}
} else {
console.error('-error, onreadystatechange gives : request.status = ' + request.status);
getDBfileXHRdeferred.reject();
}
};
if (url === "proDB.jsonp") {
console.log("-Asking local proDB.json...");
} else {
console.log("-Sending XMLHttpRequest...");
}
request.send();
return getDBfileXHRdeferred.promise;
}
편집 : 내가이 approach를 사용하여 내 기능을 다시 썼다. 이런 식으로 더 좋고 깨끗해 보입니다. 하지만 지금은 여러 attempds 처리하는 데 도움이 될 수 있습니까?
function getDBfileXHR(url, serverAttempts) {
return new Promise(function (resolve, reject) {
var request = new XMLHttpRequest();
request.open("GET", url, true); request.timeout = 2000;
var rejectdum;
if (url === "proDB.jsonp") {
console.log("-Asking local proDB.json...");
} else {
console.log("-Sending XMLHttpRequest...");
}
request.onload = function() {
if ((request.readyState === 4) && (request.status === 200 || 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 : request.status = ' + request.status + ', but jsonText is empty for url=' + url);
sendErrorEmail("BL: jsonText is empty, trying to reach server another time", 11);
sendErrorEmail("BL: jsonText is empty and attempted to reach server more than twice", 14);
var alertPopup = $ionicPopup.alert({
title: 'Error '+"11, jsonText is empty",
template: "The surfboard database could not be updated, you won't see the new models in the list, sorry for the inconvenience.",
buttons: [{
text:'OK',
type: 'button-light'
}]
});
console.log('oui on passe rejectdum')
rejectdum = 1;
reject({
status: this.status,
statusText: request.statusText
});
} else {
var parsedJson;
try {
parsedJson = JSON.parse(jsonText);
} catch (e) {
console.warn("Problem when trying to JSON.parse(jsonText) : ");
console.warn(e);
console.warn("parsedJson :");
console.warn(parsedJson);
}
if (parsedJson) {
var prodata = jsonToVarProdata(parsedJson);
console.log('-writing new prodata to localStorage');
console.log('last line of prodata:' + prodata[prodata-1]);
storageService.persist('prodata', prodata);
storageService.store('gotANewDB', 1);
}
resolve(request.response);
dbReadyDeferred.resolve();
}
}
};
request.onerror = function() {
reject({
status: this.status,
statusText: request.statusText
});
};
request.send();
});
}
이 그것을 여러 번 시도해야 할이 작업을 수행하는 깨끗한 방법입니다 (? 회) 다시 시도하는 코드를 제거하면
return getDBfileXHR(dbUrl(), serverAttempts)
.then(function() { // success
console.log('-basic XHR request succeeded.');
return dbReadyDeferred.promise;
})
.catch(function(){
if (typeof serverAttempts !== "undefined") serverAttempts++;
console.log('on passe dans le catch, serverAttempts = ', serverAttempts)
if (serverAttempts < 2) {
return getDBfileXHR(dbUrl(), serverAttempts)
.then(function() { // success
console.log('-basic XHR request succeeded.');
return dbReadyDeferred.promise;
})
.catch(function(){
console.log("-basic XHR request failed, falling back to local DB file or localStorage DB...");
return fallbackToLocalDBfileOrLocalStorageDB();
})
} else {
console.log("-basic XHR request failed, falling back to local DB file or localStorage DB...");
return fallbackToLocalDBfileOrLocalStorageDB();
}
})
.reject() 문이 호출되고 있습니까? –
예,'.reject()'메소드가 실행되고 있다는 확인을하십시오. 또한, 몇 가지 빠른 관찰 : 1.'getDBfileXHRdeferred.resolve();'호출을 보지 못했고, 빈 else else 절에서 그렇게하고 싶다고 생각합니다. 2. 시도를 반복 할 때'return get '이 아니라'getDBfileXHR (url, serverAttempts);를 반환해야합니다. 그렇지 않으면 후속 요청의 결과를 반환하지 않습니다. – GPicazo
'jsonText = '';'if (jsonText === '') {'의 바로 앞에'jsonText = ''를 넣으려고했기 때문에 약속이 거부되고 오류가 발생하지 않는다고 확신한다. '.resolve()'경우, 코드에서 제거하여 간단하게 만들었습니다. 시도를 반복하는 것에 대해 조언 해 주셔서 감사합니다. 코드 작성 방법을 잘 모르겠습니다. 나는 이것을 지금 고치고있다 : 그래서 나는'getDBfileXHR (url, serverAttempts); 반환한다;'return getDBfileXHR (url, serverAttempts);는 맞습니까? – Louis