Менее суровый поворот на «Mutable contextual state»
Использование объекта с локальным охватом для сбора промежуточных результатов в цепочке обещаний является разумным подходом к заданному вами вопросу. Рассмотрим следующий фрагмент:
function getExample(){
//locally scoped
const results = {};
return promiseA(...).then(function(resultA){
results.a = resultA;
return promiseB(...);
}).then(function(resultB){
results.b = resultB;
return promiseC(...);
}).then(function(resultC){
//Resolve with composite of all promises
return Promise.resolve(results.a + results.b + resultC);
}).catch(function(error){
return Promise.reject(error);
});
}
- Глобальные переменные являются плохими, поэтому в этом решении используется локально ограниченная переменная, которая не наносит вреда. Он доступен только внутри функции.
- Мутируемое состояние уродливое, но это не мутирует состояние уродливо. Уродливое изменчивое состояние традиционно относится к модификации состояния аргументов функции или глобальных переменных, но этот подход просто изменяет состояние переменной локального охвата, которая существует с единственной целью агрегирования результатов обещания ... переменная, которая умрет простой смертью
-
- Промежуточные обещания не препятствуют доступу к состоянию объекта результатов, но это не приводит к некоторому страшному сценарию, когда одно из обещаний в цепочке будет изгонять и саботировать ваши результаты. Ответственность за установку значений на каждом шаге обещания ограничивается этой функцией, и общий результат будет либо правильным, либо неправильным ... это не будет какой-то ошибкой, которая возникнет спустя годы в производстве (если вы не намерены ее !) [/ g3]
- Это не приводит к сценарию условий гонки, который возникает из-за параллельного вызова, потому что для каждого вызова функции getExample создается новый экземпляр переменной результатов.
задан Allan Jebaraj 8 April 2019 в 09:19
поделиться