Angular 6 & rxjs 6 - подписка возвращает неопределенный - PullRequest
0 голосов
/ 05 сентября 2018

Я использую 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
        });
    }
}

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

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

1 Ответ

0 голосов
/ 05 сентября 2018

Это потому, что вы возвращаете .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))
        );
}
...