Breeze를 사용하여 데이터를 저장하고 합리적으로 잘 작동하는 여러 저장 과정에 대한 진행 상황을보고하는 코드가 있습니다. 그러나 때로는 저장 시간이 초과되어 자동으로 한 번 다시 시도하고 싶습니다. (현재 사용자에게 오류가 표시되고 수동으로 다시 시도해야합니다.) 적절한 방법을 찾기 위해 고심하고 있지만 약속으로 인해 혼란 스럽습니다. 나는 모든 HTTP 요청에 제한 시간을 설정하는 HTTP 인터셉터가 :이 시도 된 이유 명확히하기
//I'm using Breeze, but because the save takes so long, I
//want to break the changes down into chunks and report progress
//as each chunk is saved....
var surveys = EntityQuery
.from('PropertySurveys')
.using(manager)
.executeLocally();
var promises = [];
var fails = [];
var so = new SaveOptions({ allowConcurrentSaves: false});
var count = 0;
//...so I iterate through the surveys, creating a promise for each survey...
for (var i = 0, len = surveys.length; i < len; i++) {
var query = EntityQuery.from('AnsweredQuestions')
.where('PropertySurveyID', '==', surveys[i].ID)
.expand('ActualAnswers');
var graph = manager.getEntityGraph(query)
var changes = graph.filter(function (entity) {
return !entity.entityAspect.entityState.isUnchanged();
});
if (changes.length > 0) {
promises.push(manager
.saveChanges(changes, so)
.then(function() {
//reporting progress
count++;
logger.info('Uploaded ' + count + ' of ' + promises.length);
},
function() {
//could I retry the fail here?
fails.push(changes);
}
));
}
}
//....then I use $q.all to execute the promises
return $q.all(promises).then(function() {
if (fails.length > 0) {
//could I retry the fails here?
saveFail();
}
else {
saveSuccess();
}
});
편집 : 다음은 내 코드입니다. 요청 시간이 초과되면 시간 초과 값이 위로 조정되고 오류 메시지가 표시되어 원하는 경우 더 오래 기다릴 수 있습니다.
하나의 http 요청의 모든 변경 사항을 전송하는 데 몇 분이 걸릴 것으로 보이므로 몇 가지 HTTP 요청으로 변경 사항을 적용하여 각 요청이 성공하면 진행 상황을보고하기로 결정했습니다.
이제 배치의 일부 요청이 시간 초과 될 수 있으며 일부 요청이 시간 초과 될 수 있습니다.
그런 다음 HTTP 요청을 시작하기위한 시간 제한을 낮게 설정하고 자동으로 늘리겠습니다. 그러나 일괄 처리는 동일한 시간 초과 설정으로 비동기 적으로 전송되며 각 실패에 대해 시간이 조정됩니다. 그건 좋지 않아.
이 문제를 해결하려면 배치가 완료된 후 시간 제한 조정을 이동하고 모든 요청을 다시 시도하십시오.
솔직히 말해서 자동 시간 제한 조정 및 재시도가 처음에는 그렇게 좋은 생각 인 것은 아닙니다. 심지어 그랬더라도 HTTP 요청이 차례로 진행되는 상황에서 더 나을 것입니다.이 또한 제가 살펴 봤습니다. https://stackoverflow.com/a/25730751/150342
'$의 q.all'은 모두 상관없이 실패하지 않습니다. 각 약속이 해결되고'$ q.all '전에 오류를 처리하기 전에 잡기 오류를 잡을 수 있습니다. –
내가 의미하는 바는 간단한 약속을 배열에 푸는 대신 * n * 번 시도하여 그 약속을 해결하는 함수를 푸시합니다. 실패하면 모든 것이 실패하고'$ q .all' 기능. –
사실,'$ q.all '이 항상 성공한다는 것을 발견했습니다. 그래서'then '에 전달 된 첫 번째 함수에서'fails.count()'를 확인합니다. 내가 다른 곳에서 뭔가 잘못 됐어? – Colin