Как установить субдомен const в ионном из ионного хранилища? - PullRequest
0 голосов
/ 27 января 2019

Я создаю приложение, в котором пользователи должны войти в определенный поддомен.Это отличается для каждого пользователя.Таким образом, на странице входа в систему пользователь вошел в субдомен, имя пользователя и пароль.Прежде чем делать вызовы API, я должен сохранить поддомен в ионном хранилище.Это не проблема, но как я буду использовать этот поддомен в качестве const в моем API-сервисе, потому что он асинхронный, он не дает значения сразу.

Это моя функция в сервисе

startFunction(entry) {
    this.storage.get('subdomain').then(
        result => {
            return this.http.post(result + this.apiUrl, JSON.stringify(entry), { headers: HEADER.headers}
            );
        }
    )

}

и этот компонент моей страницы

otherFunction(){
    this.GetApi.startFunction(entry).subscribe(
    result => {
        console.log(result)
    },
    err => {
        console.log(err);
    });
}

Но это выдает ошибку cannot subscribe to undefined, как использовать значение асинхронного хранилища в обещании / наблюдаемом.Лучше всего будет использовать const, который я могу использовать для каждой функции в сервисе API.

Ответы [ 3 ]

0 голосов
/ 27 января 2019

@ Берги ответ правильный.Но вам нужно подписаться после разрешения обещания, потому что ваше обещание возвращает наблюдаемое:

startFunction(entry) {
    return this.storage
               .get('subdomain')
               .then(result => this.http.post(result + this.apiUrl, JSON.stringify(entry), { headers: HEADER.headers});
}

И:

otherFunction(){
    this.GetApi.startFunction(entry)
               .then( observable$ => observable$.subscribe( result => 
    {
        console.log(result)
    },
    err => {
        console.log(err);
    }))
}
0 голосов
/ 27 января 2019

Я бы использовал HttpInterceptor здесь, чтобы избежать получения субдомена для всех http-запросов.HttpInterceptor отлично!: D

Итак, что вы можете сделать, создайте перехватчик, как говорится в вашем вопросе, вы устанавливаете поддомен перед выполнением любого http-запроса, так что, предположительно, при выполнении запроса http всегда существует поддомен.

Также я вижу, что вы устанавливаете заголовки.Если заголовки одинаковы для всех, вы также можете сделать это в перехватчике.Я не включаю его здесь, хотя.

Так вот как может выглядеть ваш перехватчик:

@Injectable()
export class NoopInterceptor implements HttpInterceptor {

  constructor(private storage: Storage) { }

  intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    const obs = Observable.fromPromise(this.storage.get('subdomain'));
      return obs.flatMap(data => {
        console.log(data); // here should be your subdomain
        // add your subdomain, and the rest of the url
        const apiReq = req.clone({ url: `${data}${req.url}` });
        return next.handle(apiReq);

    })
  }
}

Это означает, что в вашем запросе игнорируйте поддомен и просто добавьтечасть последнего URL, так как мы добавляем поддомен в перехватчик:

return this.http.post(this.apiUrl, entry, { headers: HEADER.headers}

Вот фиктивный пример, где я просто устанавливаю данные в хранилище перехватчика, вы бы сделали это там, где вы находитесьв настоящее время делает.

Обратите внимание, вам не нужно систематизировать полезную нагрузку.

StackBlitz

0 голосов
/ 27 января 2019

Вам нужно return обещание от startFunction:

startFunction(entry) {
    return this.storage.get('subdomain').then(result => {
//  ^^^^^^
        return this.http.post(result + this.apiUrl, JSON.stringify(entry), { headers: HEADER.headers};
    });
}

и затем используйте then вместо subscribe:

otherFunction(){
    this.GetApi.startFunction(entry).then(result => {
        console.log(result)
    }, err => {
        console.log(err);
    });
}
...