#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();
isundefined
? Означает ли это, что возвращаемое значениеgetRecords()
isundefined
(маловероятно) или оно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; });