как можно выполнить синхронное обещание в angular2

#http #angular #promise #synchronous

#http #угловой #обещание #синхронный

Вопрос:

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

// student.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; });

    });
  }
  

//service.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);

    }
  

на данный момент записи из службы возвращаются, но this.service.GetRecords(); не определено. и я не могу использовать

.затем

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

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

Комментарии:

1. Что вы подразумеваете под this.service.getRecords(); is undefined ? Означает ли это, что возвращаемое значение getRecords() is undefined (маловероятно) или оно this.service не определено? Откуда this.service берется? (где оно установлено?)

2. GetRecords — это функция в моем service.ts, которая возвращает список учащихся. К настоящему времени он работает, и когда я его вызываю, возвращается список студентов. но я хочу изменить значение атрибута при успешном выполнении GetRecords, для этой цели я добавил this.service.GetRecords().then (function () { console.log(«успешная запись»); this.loading = false; }, function () { console.log(«сбойGetRecord»); this.loading = true; }); но я получил ошибку при использовании. затем в неопределенном объекте.

3. Я ищу способ что-то сделать, когда служба возвращает данные. когда я вызываю this.service.GetRecords() , записи возвращаются, но мой вопрос в том, как я могу что-то сделать после возврата записей из службы?

4. Для меня код выглядит нормально. Понятия не имею, почему это не работает.

5. Я думаю, что из-за асинхронности ajax следующий код в student.ts: this.service.GetRecords().then( function () { console.log(«success GetRecord»); this.loading = false; }, function () { console.log(«сбой GetRecord»); this.loading = true; }); }); сначала вызывается, а после этого функция получает записи в вызовах службы. Я не уверен, но я думаю, может быть, что-то вроде $ q в angular1 может помочь. Я прав?

Ответ №1:

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

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

 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; });