#angular #typescript #async-await #observable
#angular #typescript #асинхронное ожидание #наблюдаемый
Вопрос:
Что я хочу сделать:
Я проверяю в БД, есть ли совпадающая дата. Если есть совпадение, оно отправляется обратно. Я делаю это с помощью запроса GET.
Затем в моем классе .ts я хочу посмотреть, является ли возвращаемое значение пустым или нет.
Это мой код:
рекомендуемый раздел.service.ts
checkRetValue(recommendedSection: RecommendedSection): boolean{
var checkNumber = this.checkOverlappingDates(recommendedSection);
}
async checkOverlappingDates (recommendedSection: RecommendedSection) {
var copy = this.convert(recommendedSection);
var localeArray = [];
recommendedSection.recommendedSectionNames.forEach( (rsn) => {
localeArray.push(rsn.locale.id);
});
await this.activeFromActiveToQuery({
active_from: copy.activeFrom,
active_to: copy.activeTo,
locale_ids: localeArray
}).subscribe((data) => {
var retNumber;
if (data.json == "") {
retNumber = 1;
} else {
retNumber = 0;
}
return retNumber;
}), (res: ResponseWrapper) => this.onError(res.json);
}
activeFromActiveToQuery(req?: any): Observable<ResponseWrapper>{
const options = createRequestOption(req);
options.params.append("active_from", req.active_from);
options.params.append("active_to", req.active_to);
options.params.append("locale_ids", req.locale_ids);
return this.http.get(this.resourceActiveFromActiveToURL, options)
.map(res => {
return res.json();
});
}
Моя проблема:
Возможно ли retNumber
вернуть функцию checkRetValue
?
Я перепробовал много предложений, но не смог найти ни одного, которое помогло бы мне.
Комментарии:
1. вы пробовали возвращать возвращаемое значение функции подписки?
Ответ №1:
Вы можете использовать метод map в конвейере для преобразования результата, а затем вернуть наблюдаемое, использование которого преобразуется в число.
Комментарии:
1. Да, это сработало. Но я все еще не могу передать значение
data
incheckOverlappingDates
, которое теперь является числом, если я напечатаю его в консоли. Но если я хочу передать его переменной с типом number, я получаю следующую ошибку: Тип ‘ResponseWrapper’ не может быть присвоен типу ‘number’.2. Вы можете изменить вывод: (res: ResponseWrapper) => this.onError(res.json). Вместо возврата this.onError(res.json), вы можете вернуть номер по умолчанию и зарегистрировать ошибку.
Ответ №2:
После того, как я попробовал множество разных решений, это сработало для меня:
async checkOverlappingDates(recommendedSection: RecommendedSection) {
var copy = this.convert(recommendedSection);
var localeArray = [];
recommendedSection.recommendedSectionNames.forEach((rsn) => { localeArray.push(rsn.locale.id); });
var tester = await this.activeFromActiveToQuery({
active_from: copy.activeFrom,
active_to: copy.activeTo,
locale_ids: localeArray
}).first().toPromise();
Вместо того, чтобы использовать метод subscribe(), который я использовал .first().toPromise()
.
Возможно, это не лучший ответ, но пока он работает нормально.