как сделать Синхронное обещание в angular2

Я пытаюсь вызвать функцию, расположенную в классе обслуживания,и если эта функция возвращает данные, одна логическая переменная устанавливает true. У меня 2 класса как боллоу:студент.ts и обслуживание.ts:

// студент.ts

    public ngOnInit() {
      this.config.load().then(() => {

      this.service.getRecords().then(
         function () { console.log("success getRecord");
                       this.loading = false; },
         function () { console.log("failed getRecord"); 
                       this.loading = true; });

    });
  }

//услуга.ts

 public getRecord(id: number): Promise<T> {
            return this.getRecordImpl();

        }

 private getRecordsImpl(): Promise<T[]> {




        let url = this.serviceUrl;

        return this.http.get(url, this.getRequestOptionsWithToken())
            .toPromise()
            .then(res => {
                this.records = this.extractData<T[]>(res);
                for (var i = 0; i < this.records.length; i++) {
                    var record = this.records[i];
                    this.onRecord(record);

                }

                 return this.records;

            })

            .catch(this.handleError);

    }

к настоящему моменту записи из сервиса возвращаются, но это.услуга.getRecords (); не определено. и я не могу использовать

.затем

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

Большое спасибо за любую помощь и руководство.

1 ответ

  1. Я думаю, что ваш подход не является правильным, какой смысл давать обещание синхронно ? Если вы действительно очень хотите сделать это, я предлагаю вам копаться вSynchronous programming with es6 generators, но обычно работа делается много задушить.

    Из вашего кода я вижу, что вы потребляете свое обещание путем прикрепления .затем () в сервисе. Таким образом, вы должны создать новое обещание.

    private getRecordsImpl(): Promise<T[]> {
    let url = this.serviceUrl;
    return new Promise((resolve, reject) => {
      this.http.get(url, this.getRequestOptionsWithToken())
        .toPromise()
        .then(res => {
          this.records = this.extractData<T[]>(res);
          for (var i = 0; i < this.records.length; i++) {
            var record = this.records[i];
            this.onRecord(record);
    
          }
          resolve(this.records);
        })
        .catch(this.handleError);
     })
    }
    

    И в вашем коде используйте:

      this.service.getRecords().then(
         function (records) { console.log("success getRecord");
                       this.loading = false; },
         function (err) { console.log("failed getRecord"); 
                       this.loading = true; });