В зависимости от версии jQuery, которую вы используете, вы можете использовать .catch
и возвращать что-то в улове, с которым обещание разрешится.
Версия Promise.all в jQuery ($ .when) не будет отклонена, если отклонено какое-либо из отложенных (реализация обещаний jQuery).
Это только начиная с версии 3, так как jQuery отложил до этоговерсия не ведет себя как стандартизированные обещания (обещания, свойственные современным браузерам).
function makeRequest(num){//returning $.Deferred like $.ajax will
var d = $.Deferred();
setTimeout(() => {
if(num>1){//reject if number passed is higher than 1
d.reject("Rejecting over one");
return;
}
d.resolve(num)
}, 10);
return d.promise();
}
$.when.apply(//jQueries Promise.all need apply to pass array of "promises"
$,
[1,2].map(//map numbers 1 and 2 to deferred 1 will resolve 2 rejects
function(num){
return makeRequest(num)
.catch(//catch rejected deferred
function(error){return "error in:"+num; }//resolve with this
);
}
)
).then(//both deferred (=jQuery promise like) are resolved
function(){
console.log("it is done",[].slice.apply(arguments));
}
)
<script
src="https://code.jquery.com/jquery-3.3.1.min.js"
integrity="sha256-FgpCb/KJQlLNfOu91ta32o/NMZxltwRo8QtmkMRdAu8="
crossorigin="anonymous"></script>
Однако вы пытаетесь сделать то же самое с версией 2 jQuery, и она не будет работать, потому что реализация deferred / обещания не похожа на стандартные обещания в версиях ниже, чем3. Вы можете конвертировать Отложенное в реальное обещание, но если вы хотите поддерживать старые браузеры, вам нужен Полифил Promise :
console.log("jQuery version",jQuery.fn.jquery);
function makeRequest(num){//function returning jQuery deferred (could be $.ajax)
var d = $.Deferred();
if(num>1){
//now this will throw an error
throw("Rejecting over one");
}
setTimeout(() => {
d.resolve(num)
}, 10);
return d.promise();
}
Promise.all(
[1,2].map(
function(num){
//convert deferred to real Promise (having catch) if makeRequest throws then promise is rejected
return Promise.resolve().then(()=>makeRequest(num))
.catch(
function(error){return "error in:"+num; }//resolve to error in... string
);
}
)
).then(
function(){
console.log("it is done",[].slice.apply(arguments));
}
)
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>