2016-10-05 3 views
0

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

// 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(); не определено. и я не могу использовать

.then

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

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

+0

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

+0

getRecords - это функция в моем service.ts, которая возвращает список учеников. К настоящему времени он работает, и когда я его называю, список студентов возвращается. но я хочу изменить значение атрибута, когда getRecords выполняется успешно, для этого я добавил this.service.getRecords(). then (function() {console.log ("success getRecord"); this.loading = false;}, function() {console.log ("failed getRecord"); this.loading = true;}); но я получил ошибку для использования. then в неопределенном объекте. –

+0

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

ответ

0

Я думаю, что ваш подход неверен, в чем смысл обещать синхронно? Если вы действительно действительно хотите это сделать, я предлагаю вам копать в 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; }); 
Смежные вопросы