Не совпадают значения итерации API и цикла - PullRequest
0 голосов
/ 26 октября 2018

Итак, у меня есть сложный вопрос, который может быть легко оценить, но у меня возникают проблемы с его работой.

У меня есть глобальный объект, который хранит различные представления формы, и когда кнопка нажата, она перебирает значения и свои API, основываясь на ключе значений внутри.Функция работает, однако цикл повторяется полностью, а затем происходит сбой API.

Я хочу объединить или удалить значения, которые были успешно отправлены из объекта, и оставить те, которые нет.Я также хочу установить некоторый тип задержки или тайм-аута между каждой итерацией для вызовов API. Я не использую API для каждого вызова одновременно.

Мой код может быть более сложным, чем должен быть, но я пытался экспериментировать с разными источниками.Я также читал о замыканиях в циклах и понимаю, почему цикл завершается до завершения API, но я просто хочу знать, есть ли лучший способ или вообще хочу, чтобы мой код функционировал должным образом.

Любая помощь в дальнейшем обучении меня этому предмету или альтернативным методам будет принята с благодарностью.

Редактировать: Таким образом, я удалил setTimeout () из вызова, и итерация работает как надо, но по какой-то причинеМассив будет разделяться до двух последних значений, и он застревает. Я также заметил, что переменная i работает, как и при удалении вызова API, но она сбрасывается при добавлении.

Мой провайдер вызываетAPI:

submitBatchData(data,authToken){
   //console.log(data,authToken);
   const httpOptions = {
       headers: new HttpHeaders({
           'Accept': 'application/json, text/plain',
           'Content-Type':  'application/json',
           'Authorization': authToken
            })
         };
      return this.http.post(this.apisubmitTreatUrl, JSON.stringify(data), httpOptions).retry(3).timeout(10000).delay(2000);

 }
Основная итерация цикла while:
  submitOfflineForm(data){
  var data = data;
  var length:number = data.length;
  var secondLength = data.length;
  var testLength = data.length;
  var count=0;

  while(secondLength--){//I have another loop that runs before checking for another value. Hance the multiple variables
    //console.log(secondLength);
    //console.log(count);
      this.callAPI(testLength,secondLength,data[secondLength],data);
  }
}
callAPI(testLength,i,data,allData) {
//where code is being run
}

Когда я запускаю только журналы консоли и массив сплайсинга, он работает следующим образом (3 значения в массиве):

case "Batch": {
 console.log(i);
 console.log('Before: ' + allData);
 allData.splice(i,1);
 console.log('After: ' + allData);
break;
 }

Журналы:

2
dataservice.ts:279 Before: [object Object],[object Object],[object Object]
dataservice.ts:281 After: [object Object],[object Object]
1
dataservice.ts:279 Before: [object Object],[object Object]
dataservice.ts:281 After: [object Object]
dataservice.ts:278
0
dataservice.ts:279 Before: [object Object]
dataservice.ts:281 After: 

Но когда я добавляю вызов API:

case "Batch": {
    // console.log("Here in Batch");
     submit.submitBatchData(data["Info"],token).subscribe((result)=>{
       //console.log(result["Status"]);
         if(result["Status"]==true){
            console.log(i);
            console.log('Before: ' + allData);
            allData.splice(i,1);
            console.log('After: ' + allData);
          // isEmpty(i,allData,storage,offline,loading);
         }
         else{
            this.presentToast('Batch Treatment not submitted with location!');
         }

     }, (err)=>{
        this.presentToast('Could not submit Batch Location!');
    });
    break;
 }    

Журналы:

1
dataservice.ts:279 Before: [object Object],[object Object],[object Object]
dataservice.ts:281 After: [object Object],[object Object]
dataservice.ts:413 Current length of array after splicing: 2
dataservice.ts:414 (2) [{…}, {…}]
dataservice.ts:416 (2) [{…}, {…}]
2
dataservice.ts:279 Before: [object Object],[object Object]
dataservice.ts:281 After: [object Object],[object Object]
dataservice.ts:413 Current length of array after splicing: 2
dataservice.ts:414 (2) [{…}, {…}]
dataservice.ts:416 (2) [{…}, {…}]
0
dataservice.ts:279 Before: [object Object],[object Object]
dataservice.ts:281 After: [object Object]
dataservice.ts:413 Current length of array after splicing: 1
dataservice.ts:414 [{…}]
dataservice.ts:416 [{…}]

Значение i сбрасываетсяполностью, я не уверен, почему именно это происходит.Любая помощь будет оценена.

1 Ответ

0 голосов
/ 05 ноября 2018

Я хочу соединить или удалить значения, которые были успешно отправлены из объекта, и оставить те, которые не были.Я также хочу установить некоторый тип задержки или тайм-аута между каждой итерацией для вызовов API, чтобы я не включал API для каждого вызова одновременно.

Есть ли причина, по которой вам нужносклеивать и удалять значения?Что если вы сохраните элемент формы в массиве и будете использовать структуру данных, которая включает в себя состояние формы?

[
    {
        form: {...},
        status: "pending" // or "invalid" or "submitted" etc
    },
    ...
]

Если вы следуете такому дизайну, вы можете перебирать формы разными способами и несколько раз безвызывая ошибки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...