Angular 6 и rxjs 6 — подписка возвращает undefined

Я использую Angular CLI 6.1.3, rxjs 6.2.2.

К моему вопросу:

Я реализовал службу RespSearchService, которая отвечает за получение информации от Sharepoint.

Следующий код запрашивает JSON из Sharepoint:

public search(queryString: string): Observable<any> {
    return from(
        web.siteUsers
            .filter("substringof(\'" + queryString + "\',Email)")
            .get()
            .then(v => {
                console.log('search', v);
            })
    );
}

Приведенный выше код работает должным образом и записывает JSON в консоль.

Моя проблема заключается в другом компоненте, где я подписываюсь на Observable, как и во всех других случаях, когда это работает. Но как-то тут не получится. Похоже, что Observable возвращает пустой объект, так как журнал в консоли говорит undefined.

export class ClaimFormInfoComponent implements OnInit {

    public claim: Claim = new Claim();
    public results: any;
    queryField: FormControl = new FormControl();
    constructor(private data: DataService, private respSearch: RespSearchService) { }

    ngOnInit() {
        this.data.currentClaim.subscribe(claim => this.claim = claim);

        this.respSearch.search("chri").subscribe((response: any) => {
          this.results = response;
          console.log('results', this.results); \\-> results undefined
        });
    }
}

Я застрял. У меня больше нет идей, и я не могу найти ничего полезного в Интернете.

Заранее спасибо за любую подсказку или идею!


person Christian    schedule 04.09.2018    source источник


Ответы (1)


Это потому, что вы возвращаете .then() как обещание, которое было бы неопределенным, потому что вы ничего не вернули внутри обратного вызова.

Чтобы избавиться от неопределенного, вы хотели бы вернуть значение V:

.then(v => {
    console.log('search', v);
    return v;
})

Но опять же (извините за каламбур), вы просто захотите вернуть обещание .get(). Если вы действительно хотите записывать значения в консоль, вы можете использовать оператор tap():

public search(queryString: string): Observable<any> {
    return from(web.siteUsers
        .filter("substringof(\'" + queryString + "\',Email)")
        .get()
    )
        .pipe(
            tap(v => console.log('search', v))
        );
}
person CozyAzure    schedule 05.09.2018
comment
Спасибо! Это решило проблему. Буду читать дальше об этом. - person Christian; 05.09.2018