【问题标题】:How to return data from a service not a HttpClient to component如何将数据从服务而不是 HttpClient 返回到组件
【发布时间】:2018-11-10 18:02:00
【问题描述】:

我有这项服务,我需要将产品返回到我在这里不使用的组件 HttpClient 或 Observable 因为我不需要它们

export class StoreDataProvider {

  private _wooData: any;

  constructor() {
    this._wooData = Woo({
      url: 'http://example.com/',
      consumerKey: 'key here',
      consumerSecret: 'key here',
      wpAPI: true,
      version: 'wc/v3'
    });
  }

  getAllProducts() {
    return this._wooData.get('products', (err, data, res) => {
      return res 
    });
  }

}

上面的代码返回标头,而不是产品,但是如果我在服务本身中控制产品而不是返回,我会得到产品!代码是这样的:

export class StoreDataProvider {

  private _wooData: any;

  constructor() {
    this._wooData = Woo({
      url: 'http://example.com/',
      consumerKey: 'key here',
      consumerSecret: 'key here',
      wpAPI: true,
      version: 'wc/v3'
    });
  }

  getAllProducts() {
    this._wooData.get('products', (err, data, res) => {
      console.log(res); 
    });
  }

}

如果我在服务中进行控制台登录,则组件中的代码只是 console.log( this._wooService.getAllProducts() )

那么我在这里错过了什么?

【问题讨论】:

  • 我不太确定你在问什么,但答案可能是stackoverflow.com/q/6847697/3001761
  • 我在问如何从不是来自 HttpClient 模块的服务返回响应! @SiddAjmera 帮助了我!并且我批准了他的回答,您可以查看一下无论如何感谢您的光临并且很有趣地帮助我解决了我的问题! ♥

标签: javascript angular ionic3 angular-services


【解决方案1】:

有很多解决这个问题的方法:

1。 使用 BehaviorSubject

import { BehaviorSubject } from 'rxjs';

export class StoreDataProvider {

  private _wooData: any;
  private wooData: BehaviorSubject<any> = new BehaviorSubject<any>(null);
  public wooData$ = this.wooData.asObservable();

  constructor() {
    this._wooData = Woo({...});
  }

  getAllProducts() {
    this._wooData.get('products', (err, data, res) => {
      this.wooData.next(res);
    });
  }

}

然后你可以像这样在你的组件中使用它:

constructor(private _wooService: WooService) {}

ngOnInit() {
  this._wooService.wooData$.subscribe(res => console.log(res));
  this._wooService.getAllProducts();
}

请注意,当我们使用 null 初始化 BehaviorSubject 时,最初您将得到 null。但是,只要您致电getAllProducts 并收到数据,您就会得到您的数据。

2。 使用承诺。

export class StoreDataProvider {

  private _wooData: any;

  constructor() {
    this._wooData = Woo({...});
  }

  getAllProducts(cb) {
    return new Promise((resolve, reject) => {
      this._wooData.get('products', (err, data, res) => {
        if(err) reject(err);
        else resolve(res);
      });
    });
  }

}

然后你可以像这样在你的组件中使用它:

constructor(private _wooService: WooService) {}

ngOnInit() {
  this._wooService.getAllProducts()
    .then((res) => console.log(res))
}

3。 使用回调

export class StoreDataProvider {

  private _wooData: any;

  constructor() {
    this._wooData = Woo({...});
  }

  getAllProducts(cb) {
    this._wooData.get('products', (err, data, res) => {
      cb(res);
    });
  }

}

然后你可以像这样在你的组件中使用它:

constructor(private _wooService: WooService) {}

ngOnInit() {
  this._wooService.getAllProducts((res) => console.log(res));
}

【讨论】:

  • 非常感谢,兄弟的回答对我很有帮助♥
  • @heshamshawky,我很高兴它做到了。快乐编码。 :)
  • 我能问你这个吗?我想在这里学习离子!但是我被一个奇怪的问题弄糊涂了,那就是在使用最后一个 Angular 版本 6 或更高版本时,我在使用这个库(woocommerce-api)时会遇到很多错误,但是如果我使用 Angular 5(Ionic 3)它工作得很好!! !我对这个问题做了很多研究,我发现可能是 'lib' woocomerce-api 使用了一些后端代码,并且在版本 +6 的 Angular 中不再可用!那么有没有办法可以将此模块与 angular 6 ( ionic 4 ) 一起使用?如果你真的帮助我,我会很高兴♥
猜你喜欢
  • 1970-01-01
  • 2016-05-24
  • 2018-03-30
  • 2021-08-17
  • 1970-01-01
  • 1970-01-01
  • 2017-07-24
  • 2021-01-04
  • 2019-08-31
相关资源
最近更新 更多