최신 정보:
이 게시물의 향후 시청자를 돕기 위해 나는 pluma의 답변 데모를 만들었습니다 .
질문:
나의 목표는 매우 간단 해 보인다.
step(1)
.then(function() {
return step(2);
}, function() {
stepError(1);
return $q.reject();
})
.then(function() {
}, function() {
stepError(2);
});
function step(n) {
var deferred = $q.defer();
//fail on step 1
(n === 1) ? deferred.reject() : deferred.resolve();
return deferred.promise;
}
function stepError(n) {
console.log(n);
}
여기서 문제는 1 단계에서 실패하면 stepError(1)
AND stepError(2)
가 모두 발생한다는 것 입니다. 내가하지 않으면 return $q.reject
다음 stepError(2)
발사,하지만하지 않습니다 step(2)
이해하는 것입니다. 내가하려는 일을 제외하고 모든 것을 성취했습니다.
오류 체인의 모든 함수를 호출하지 않고 거부시 함수를 호출 할 수 있도록 약속을 작성하는 방법은 무엇입니까? 아니면 이것을 달성하는 다른 방법이 있습니까?
여기에 데모가 있으므로 작업이 필요합니다.
최신 정보:
나는 가지 를 해결했다. 여기서는 체인 끝에서 오류를 포착하고 데이터를 전달 reject(data)
하여 오류 기능에서 처리해야 할 문제를 알 수 있습니다. 데이터에 의존하고 싶지 않기 때문에 실제로 요구 사항을 충족시키지 못합니다. 그것은 절름발이이지만 내 경우에는 반환 된 데이터에 의존하여 수행 할 작업을 결정하는 대신 오류 콜백을 함수에 전달하는 것이 더 깨끗합니다.
step(1)
.then(function() {
return step(2);
})
.then(function() {
return step(3);
})
.then(false,
function(x) {
stepError(x);
}
);
function step(n) {
console.log('Step '+n);
var deferred = $q.defer();
(n === 1) ? deferred.reject(n) : deferred.resolve(n);
return deferred.promise;
}
function stepError(n) {
console.log('Error '+n);
}
Promise.prototype.catch()
MDN의 예는 똑같은 문제에 대한 솔루션을 보여줍니다.