Наблюдаемый: проверка, является ли возвращаемое значение пустым или нет

#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 in checkOverlappingDates , которое теперь является числом, если я напечатаю его в консоли. Но если я хочу передать его переменной с типом 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() .

Возможно, это не лучший ответ, но пока он работает нормально.