Как вернуть эти данные компоненту из обещания в провайдере - PullRequest
0 голосов
/ 25 апреля 2018

Код ниже показывает мой вызов в компоненте.

getLocations находится в provider.

Я не понимаю, как вернуть данные обратно в компонентдля отображения пользователю.Я могу видеть данные в формате [{},{}] в консоли, но мне нужно получить доступ, используйте их на внешнем интерфейсе.

Я очень плохо знаком с angular, и это моя первая попытка HTTP-вызова с использованием * 1010.*.

Любая помощь / предложения будут с благодарностью.

Это лучшая практика для Angular 5?Извините за мое невежество.

constructor(public navCtrl: NavController, public navParams: NavParams, public loginProvider: LoginProvider, public alertCtrl: AlertController) {

        this.loginProvider.getLocations();
  }

getLocations() {
    let promise = new Promise((resolve, reject) => {
      let apiURL = 'http://xxxx-dev.xxxxxxx.com/api/default/v1/locations';
       this.http.get(apiURL)
      .toPromise()
      .then(
        res => { // Success

          this.locations = res.json(); 
          console.log(this.locations);
          resolve();                

        }
      );
  });
  return promise;
}

Ответы [ 3 ]

0 голосов
/ 25 апреля 2018

Я не думаю, что вам нужно явно создавать новое обещание, когда вы уже используете вызов toPromise ().Я бы использовал что-то вроде этого:

async ngOnInit(): Promise<void> {
   this.locations = await this._getLocations();
}

private _getLocations(): Promise<Location[]> {
   return this._http.get<LocationReturnData>(apiUrl).toPromise().then(res => res);
}

async и await - это просто сокращение для обработки обещаний.await будет ждать возврата обещания перед переходом к следующей строке кода, и для этого требуется асинхронный обработчик.Это намного короче и проще, чем стек ().

Я не видел инъекцию для http, но я предполагаю, что вы используете последнюю версию HttpClient, которая по умолчанию должна обрабатывать любые данные json для вас.

0 голосов
/ 14 апреля 2019

если вам нужен результат запроса при вызове другого метода, вы должны просто вернуть его в функцию onfulfilled (success), например:

    getLocations() {
         let apiURL = 'http://xxxx-dev.xxxxxxx.com/api/default/v1/locations';
         return   this.http.get(apiURL)
          .toPromise()
          .then(
            (success) => { 
              this.locations = res.json(); 
              console.log(this.locations);

              return success;          
            }
          );
    }

    otherMethod() {
        getLocations().then(
            (res) => {
                //you see result of query that returned in http request
            }
        );
    }
}
0 голосов
/ 25 апреля 2018

Во-первых, вам нужно разрешить данные в обещании, как показано ниже:

// Promise provide two executors for normal and exception branches
new Promise(resolve, reject)

// if you are using HttpClient instead of Http, you don't need to call .json method
resolve(res.json());  
// for throwing err
reject(new Error('sample err'))  

Затем вы можете получить данные результата в then обещании, как показано ниже:

this.loginProvider.getLocations().then(result => {
  // result is the data you resolved in promise
  // do things based on result 
}).catch(err => {
  // deal with exceptions
})

Подробнее об обещании см. документы .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...