データ(バッチ)を外部APIに投稿する必要があり、バッチはリクエストごとに5アカウントを超えることはできません。そのため、コードを使用して配列を以下のように小さなチャンクにチャンクし、ループでhttpサービスを呼び出してチャンクされたデータを渡しました。
しかし、問題は、バックエンドのAPIが同時に実行されることです。Angularで最初の呼び出しを待ってから、サービスへの次の呼び出しを開始する方法がわかりません。ループの最後に到達するまで続きます。
chunk(arr, chunkSize) {
if (chunkSize <= 0) throw "Invalid chunk size";
var R = [];
for (var i=0,len=arr.length; i<len; i+=chunkSize)
R.push(arr.slice(i,i+chunkSize));
return R;
}
submitReport():void{
//uniquechildids =[1,2,3,4,5,6,7,8,9,10];
//break into small chunks
const chunkedAccounts = this.chunk(uniquechildids,5);
//output [1,2,3,4,5] [6,7,8,9,10]
let i = 0;
//loop through the chunked array and create params
for(let account of chunkedAccounts ) {
const rParam = new ReportParamsModel();
rParam.childIds = account;
//call the backend service that calls the api in C#
this.reportService.submitReport(rParam).subscribe(result => {
if(result.statuscode == 200){
//do some stuff here
}
this.loadingMessage = `Submitted batch ${i} of ${chunkedAccounts .length}`;
},
error=>{
console.log(error);
});
i++;
}
バックエンドAPIは、2回、またはchunkedAccountの長さが何であれ同時にヒットしています。
async / awaitを使用して、各呼び出しを待つことができます。
chunk(arr, chunkSize) {
if (chunkSize <= 0) throw "Invalid chunk size";
const R = [];
for (let i = 0, len = arr.length; i < len; i += chunkSize)
R.push(arr.slice(i, i + chunkSize));
return R;
}
async submitReport(): Promise<void> {
//uniquechildids =[1,2,3,4,5,6,7,8,9,10];
//break into small chunks
const chunkedAccounts = this.chunk(uniquechildids,5);
//output [1,2,3,4,5] [6,7,8,9,10]
let i = 0;
//loop through the chunked array and create params
for(let account of chunkedAccounts) {
const rParam = new ReportParamsModel();
rParam.childIds = account;
//call the backend service that calls the api in C#
try {
const result = await this.reportService.submitReport(rParam).toPromise();
if(result.statuscode === 200){
//do some stuff here
}
this.loadingMessage = `Submitted batch ${i} of ${chunkedAccounts .length}`;
} catch (error) {
console.log(error);
}
i++;
}
}
これが短い例です:
async function f(i) {
console.log('Starting: ' + i);
return new Promise((resolve, reject) => {
setTimeout(() => {
console.log('Finished: ' + i);
if (i > 3) reject('Error: i > 3');
resolve();
}, 1000);
});
}
async function submitReport() {
const chunkedAccounts = [1, 2, 3, 4]
for(let account of chunkedAccounts) {
try {
await f(account);
} catch (error) {
console.log(error);
}
}
}
submitReport();
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加