У меня есть массив объектов следующего типа.
processing-details.model.ts
export class ProcessingDetails{
id: string;
isProcessingOccured: boolean;
isProcessingSuccessful:boolean;
constructor(id,isProcessingOccured,isProcessingSuccessful) {
this.id = id;
this.isProcessingOccured = isProcessingOccured;
this.isProcessingSuccessful = isProcessingSuccessful;
}
}
Массив генерируется динамически на основе определенных входных данных. Как только массив сгенерирован, он выглядит следующим образом.
processingArray = [{id:1, isProcessingOccured: false, isProcessingSuccessful: false},
{id:2, isProcessingOccured: false, isProcessingSuccessful: false},
.....
{id:k, isProcessingOccured: false, isProcessingSuccessful: false}]
У меня есть конечная точка REST, которая принимает объект типа ProcessingDetails. Ниже приведен мой сервисный код.
automatic-batch.service.ts
@Injectable()
export class AutomatedBatchService {
constructor(@Inject('baseUrl') private baseUrl: string, private httpClient: HttpClient) {}
public triggerProcessing(batchDetails:ProcessingDetails) {
return this.httpClient.post(`${this.baseUrl}`,batchDetails);
}
}
Моя цель - вызвать triggerProcessing
для каждого элемента processingArray
синхронно. Если triggerProcessing
вызывается для одного объекта processingArray
, мы устанавливаем isProcessingOccured
для этого конкретного объекта как true
. Если серверная часть возвращает успех для triggerProcessing
вызова, который мы сделали для объекта, тогда мы устанавливаем isProcessingSuccessful
в true
. Например, предположим, что обработка прошла успешно для id = 1 и id = 2. Массив должен выглядеть следующим образом:
processingArray = [{id:1, isProcessingOccured: true, isProcessingSuccessful: true},
{id:2, isProcessingOccured: true, isProcessingSuccessful: true},
{id: 3, isProcessingOccured: false, isProcessingSuccessful:false }
.....
{id:k, isProcessingOccured: false, isProcessingSuccessful: false}]
Если обработка одного объекта завершается неудачно, мы не должны обрабатывать оставшуюся часть массив. Например, если обработка объекта {id: 3, isProcessingOccured: false, isProcessingSuccessful:false }
не удалась, мы не должны запускать вызов службы с {id: 4, isProcessingOccured: false, isProcessingSuccessful:false }
и далее.
В настоящее время я использую async/await
для достижения этой цели. Ниже приведен мой код
processing-test.component.ts
import { Component } from "@angular/core";
@Component({
selector: 'processing-test',
templateUrl: './processing-test.component.html',
styleUrls:['./processing-test.component.css'],
providers: [AutomatedBatchService]
})
export class ProcessingTestComponent {
constructor(private automatedBatchService: AutomatedBatchService) { }
public isSuccess:boolean = true;
public processingArray: Array<ProcessingDetails>= [];
async startBatchRun() {
for( var i = 0; i < this.processingArray.length; i++ ) {
if(this.isSuccess){
await this.automatedBatchService.triggerProcessing(this.processingArray[i])
.toPromise()
.then(res => {
this.processingArray[i].isProcessingOccured = true
this.processingArray[i].isProcessingSuccessful = true
})
.catch(rej => {
this.isSuccess = false
this.processingArray[i].isProcessingOccured = true
this.processingArray[i].isProcessingSuccessful = false
});
}else {
break;
}
}
}
}
Это лучший способ для достижения этой цели? Есть ли способ, где я могу полностью избежать использования Promises
, async/await
и добиться того же синхронного вызова, используя Observables
?