Я просто написал пользовательскую функцию promise.all()
и использовал ее вместо стандартного Promise.all()
. Если все обещания разрешены, он выполняет точно так же, как и стандартный. Если одно из других обещаний отклонено, оно возвращает первое, которое отклонено так же, как и стандартное, но в отличие от него ждет всех обещаний разрешить / отклонить:
var promise = {}; // custom namespace for promise-related stuff
promise.all = function(values)
{
var e;
return Promise.all(values.map(function(value) {
return Promise.resolve(value).catch(function(error) {
e = e || error;
});
})).then(function(values2) {
if(e)
throw e;
return values2;
});
};
Мы можем пойти еще дальше, чтобы нежно расширьте стандарт Promise.all()
одним дополнительным параметром wait
следующим образом:
(function() {
var stdAll = Promise.all;
Promise.all = function(values, wait) {
if(!wait)
return stdAll.call(Promise, values);
return promise.all(values);
}
})();
Это может быть разумным, так как новая версия обратно совместима со стандартной, просто расширяя ее функциональность. (Мы можем полностью избежать пользовательского пространства имен promise
- он используется для краткости, чтобы показать эту идею.)
Люди, которые разрабатывают стандарты - почему бы не включить это в новый стандарт Promise?