js関数から拒否された約束を返す必要があります。私はあなたが見ることができるように角度$ qを使用しています。しかし、それは動作しません。機能getDBfileXHRで ファンクションが返された約束を返すときエラーケースに渡る
、約束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;
}
EDIT: 私はこの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();
});
}
は、それはいくつかの試みを行うにこれを行うにはきれいな方法です:(?2回)再試行するコードを削除する場合
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'節でそれをしたいと思います。 2.試行を繰り返すときは 'return getDBfileXHR(url、serverAttempts);'を返すべきです。そうでなければ、後続のリクエストの結果を返すことはありません。 – GPicazo
私は 'jsonText = '';'の直前に '{(jsonText === ''){' を入れようとしたため、約束が拒否され、エラーの場合は実行されないと確信しています。 () 'の場合は、簡単にするためにコードから削除しました。 これを繰り返していただきありがとうございました。私はこれをコード化する方法がわかりませんでした。私は今これを修正しているので、 'getDBfileXHR(url、serverAttempts);を置き換えるべきです。 return get; 'return getDBfileXHR(url、serverAttempts);'そうですか?私は 'var getDBfileXHRdeferred = $ q.defer()'をgetDBfileXHR関数の中で宣言しているので、毎回リセットされるので、 – Louis