Наблюдаемая угловая с помощью счетчика - PullRequest
0 голосов
/ 16 октября 2018

Я сейчас изучаю асинхронные угловые.У меня есть код ниже внутри функции и внутри для каждого цикла.Я хотел бы узнать количество успешных запросов, а затем создать уведомление.Я понимаю, что из-за асинхронности операторы if бесполезны, потому что numOfSuccessfulRequests со значением 0. Как бы я тогда произвел подсчет или предоставил ссылку на учебный материал, я не уверен, как называется эта проблема.

Я хотел бы просто получать уведомления в конце после каждого цикла, а не о каждом вызове

 this.checkedItems.forEach(checkedItem => {
    let numOfSuccessfulRequests = 0
        apiCall(checkedItem.record.id, 'active').first().subscribe(
                  () => {
                    numOfSuccessfulRequests++
                  },
                  () => {
                    this._notification.error("A request failed")
                  }
              );
            });

        //numOfSuccessfulRequests won't have a value here, so the below code is useless

        if (numOfSuccessfulRequests === 1) {
              this._notification.success(`A request was successful`);
            } else if (numOfSuccessfulRequests > 1) {
              this._notification.success(`There were ${numOfSuccessfulRequests} successful requests`);
            }

Ответы [ 2 ]

0 голосов
/ 16 октября 2018

Если вы хотите показать уведомление после всех выполнений службы, вы можете использовать forkJoin в RxJS, как показано ниже

import {forkJoin, Observable} из "rxjs";

var services=[];
this.checkedItems.forEach(checkedItem => {

        services.push(apiCall(checkedItem.record.id, 'active'));
});

тогда вы можете запустить все сервисы вместе, используя forkJoin

forkJoin(services).subscribe((response)=>{

    //after all the successful requests 
    //response.forEach((eachRes)=>{console.log(eachRes)});
    this._notification.success(`A request was successful`);

});;

Примечание: ответом будет массив, основанный на количестве ответов на запросы.

0 голосов
/ 16 октября 2018

У вас проблема с последовательностью вызова Asynchronous.Вы выполняете код сообщения об успехе, прежде чем получите ответ.

Просто внесите следующее изменение

объявите на уровне класса

public  numOfSuccessfulRequests = 0;

Изменение в вызове API

this.checkedItems.forEach((checkedItem, index) => {
    apiCall(checkedItem.record.id, 'active').first().subscribe(
              () => {
                this.numOfSuccessfulRequests++;

                //Display message for last API call
                if(this.checkedItems.length == index){
                   this.showSuccessMessage();
                }
              },
              () => {
                this._notification.error("A request failed");
              }
          );
        });
}

Создать функцию для отображения сообщения

showSuccessMessage(){

       if (this.numOfSuccessfulRequests === 1) {
          this._notification.success(`A request was successful`);
        } else if (numOfSuccessfulRequests > 1) {
          this._notification.success(`There were ${numOfSuccessfulRequests} successful requests`);
        }

}
...