Если вы поддерживаете современные браузеры, то вы можете использовать метод Promise.race()
, возвращающий обещание, которое выполняет или отклоняет, как только одно из обещаний в итерируемом выполняет или отклоняет, со значением или причина этого обещания.
Promise.race([getPic('blah.jpg'), getPic('blah_two.jpg')])
.then(function(result) {
$('#div').hide();
}).catch(function(result) {
$('#div').show();
})
Вот диаграмма Совместимость браузера . Он не поддерживается только в IE.
Чтобы искать выполненное обещание, вы используете эту oneSuccess()
вспомогательную функцию, например:
function oneSuccess(promises){
return Promise.all(promises.map(p => {
// If a request fails, count that as a resolution so it will keep
// waiting for other possible successes. If a request succeeds,
// treat it as a rejection so Promise.all immediately bails out.
return p.then(
val => Promise.reject(val),
err => Promise.resolve(err)
);
})).then(
// If '.all' resolved, we've just got an array of errors.
errors => Promise.reject(errors),
// If '.all' rejected, we've got the result we wanted.
val => Promise.resolve(val)
);
}
и затем передайте массив изображений getPic
, например:
oneSuccess([getPic('blah.jpg'), getPic('blah_two.jpg')])
.then(function(result) {
$('#div').hide();
}).catch(function(result) {
$('#div').show();
})
Демо:
function oneSuccess(promises) {
return Promise.all(promises.map(p => {
return p.then(
val => Promise.reject(val),
err => Promise.resolve(err)
);
})).then(
errors => Promise.reject(errors),
val => Promise.resolve(val)
);
}
// Case 1: First resolved promise
oneSuccess([
Promise.resolve(1), Promise.reject(2), Promise.resolve(3)
]).then(result => console.log('First Success: ', result))
// Case 2: No resolved promise
oneSuccess([
Promise.reject(1), Promise.reject(2), Promise.reject(3)
]).catch(error => console.log('All failed: ', error))