同步功能 - 在Angular2中

时间:2016-01-17 15:21:33

标签: javascript angularjs angular rxjs angular2-http

我需要达到角度同步功能(另一个等待第一个结束)。

例如,我有两个提供程序(MenuProvider和ShopProvider)。

MenuProvider有一个方法:

bridal_requests

通过HTTP检索当前商店的菜单项。

ShopProvider有一个方法:

getMenuItemsForCurrentShop()

通过HTTP设置当前使用的商店。

我需要" getMenuItemsForCurrentShop()"在" setCurrentShopById(idShop:number)"之后调用。理想情况下没有回调。

2 个答案:

答案 0 :(得分:3)

在angular1与angular2中处理这种情况的方式有所不同。

angular1的典型方法是使用promises,即你的第一个提供者方法将返回promise,你所做的只是在返回对象上调用.then方法,传递将接受结果的callback函数第一种方法,你将在其中调用第二种方法。

有关此技术的示例,您可以看到@Pankaj的答案。

Angular2在这个意义上是不同的,因为它开始使用ReactiveExtensions库(rx.js)。因此,与承诺相比,每个可能返回Observable<Someth>的组件提供了更多的方法来处理它。 (你仍然可以使用promises方法和observables)。

有关如何使用angular2 \ http模块的示例,请参阅另一个问题:Angular 2: How to use/import the http module?

另请查看angular2

中的http module docs

<强> ShopApi.ts:

&#13;
&#13;
import {Injectable, bind} from 'angular2/di';
import {Http, Headers} from 'angular2/http';
import {Observable} from 'rx'; 
   
@Injectable()
export class ShopApi {
  constructor(public http: Http) {
  }

  setCurrentShopById(idShop:Number) {
    return this.http.get('http://myservice.com/current/shop/', idShop)
    .toRx()
    .map(res => res.json());
  }

  getMenuItemsForCurrentShop() {
    return this.http.get('http://myservice.com/current/shop/items')
    .toRx()
    .map(res => res.json());
  }
}
&#13;
&#13;
&#13;

答案 1 :(得分:2)

您不应该考虑制作同步ajax来解决您的问题,因为它们会导致浏览器挂起(糟糕的用户体验)&amp;也停止执行一段时间的代码。可能在将来sync任何浏览器都不支持ajax。

您只需按照异步方式处理此问题,使用promise模式可以帮助您解决问题。您应该在setCurrentShopById .then function。

的成功函数中调用其他函数getMenuItemsForCurrentShop
  

我假设getMenuItemsForCurrentShop函数已经返回了promise   对象

this.getMenuItemsForCurrentShop().then((response) => {
    this.setCurrentShopById(response.artists.items);
});