Angular Ionic HTTP обещают не работает так, как должно - PullRequest
0 голосов
/ 26 февраля 2019

У меня есть служба, которая получает данные конечной точки:

Service.ts

  getAllProducts(){
    return new Promise( (resolve, reject) => {
      this.apiService.get( this.allProducts, `/products`, {} )
        .then( data => resolve( data.map( item => this.parseProductDetails( item ) ) ) )
        .catch( err => reject( err ) );
    } );
  }

console.log(data) - выдает все продукты.Все в порядке. И функция this.parseProductDetails также нормально возвращает все продукты.

Но когда я звоню из компонента:

ionViwDidLoad(){
  this.productProvider.getAllProducts()
          .then( () => {
            items => this.items = items; 
            console.log('All products', this.items)
          }  )
          .catch( err => console.debug( 'products not found', err ) )
}

console.log('All products', this.items) - ничего в журнале консоли не возвращается, недаже не определено или Текст всех продуктов.

Что не так с этим кодом и что я должен изменить, чтобы я мог получать информацию в компоненте?

parseProductDetails (item):

protected parseProductDetails( data: any ): Object {
    let parsed: any = data;

    try {
      parsed.dimensions = JSON.parse( data.dimensions );
    } catch( e ) { parsed.dimensions = []; }

    if( data.price )
      parsed.priceFormatted = this.formatPrice( data.price, data.currency );
    else
      parsed.priceFormatted = false;

    if( data.delivery )
      parsed.deliveryFormatted = this.formatPrice( data.delivery, data.currency );
    else
      parsed.deliveryFormatted = false;

    if( data.stock )
      parsed.stockFormatted = this.formatStock( data.stock, data.stockUnit );
    else
      parsed.stockFormatted = false;

    return parsed;
  }

возвращенный анализ дает массив.

Ответы [ 3 ]

0 голосов
/ 26 февраля 2019

Вы используете две функции стрелок внутри then().Вы должны удалить один.

ionViwDidLoad(){
  this.productProvider.getAllProducts()
          .then( (items) => {
            this.items = items; 
            console.log('All products', this.items)
          })
          .catch( err => console.debug( 'products not found', err ) )
          .then( () => loading.dismiss() );
}
0 голосов
/ 26 февраля 2019

Здесь, похоже, что-то идет не так.Я не знаю, какова точная причина, но я предполагаю, что параметр items размещен неправильно.Попробуйте это:

getAllProducts() {
  return this.apiService.get(this.allProducts, `/products`, {}).then((data) => { 
    console.log('items', data);
    return data.map((item) => this.parseProductDetails(item))
  });
}

Который вы называете как:

ionViwDidLoad(){
  this.productProvider.getAllProducts()
    .then((items) => {
      this.items = items;
      console.log('All products', this.items)
    })
    .catch((err) => console.debug( 'products not found', err ))
    .then(() => loading.dismiss());
}
0 голосов
/ 26 февраля 2019

вопросы по обещанию, затем обратный вызов:

this.productProvider.getAllProducts()
      .then((items) => {
        console.log('All products', items)
      }  )
      .catch( err => console.debug( 'products not found', err ) )
      .then( () => loading.dismiss() );
...