当前位置: 首页 > 知识库问答 >
问题:

Angular2可观察-在继续之前等待多个函数调用

翟越
2023-03-14

我正试图通过迁移当前使用Angular1/AngularJS编写的应用程序来提高我对Angular2的了解。

有一个特征特别难倒了我。我试图复制一个功能,其中调用函数等待继续,直到它正在调用的函数完成了一个循环的promise。在AngularJS中,我调用的函数基本上是这样的:

this.processStuff = function( inputarray, parentnodeid ) {
    var promises = [];
    var _self = this;
    angular.forEach( inputarray , function( nodeid ) {

        switch ( parentnodeid )
        {
            case ‘AAA’ : var component = _self.doMoreStuff( nodeid, parentnodeid ); break;
            case ‘BBB’ : var component = _self.doMoreStuff( nodeid, parentnodeid ); break;
            case ‘CCC’ : var component = _self.doMoreStuff( nodeid, parentnodeid ); break;
            default    : var component = null;
        }
        promises.push( component );
    });
    return $q.all(promises);
}; 

它包含一个调用另一个函数(doMoreStuff)的forEach循环,该函数还返回一个promise,并将所有返回的promise存储在一个数组中。

使用AngularJS,当我在另一个函数中调用ProcStuff时,我可以指望系统等待,直到ProcStuff完成,然后才能在随后的块中输入代码:

service.processStuff( arraying, parentidarg )
       .then(function( data ) {
              ... 

调用者等待所有调用完成,直到调用者进入它的代码块。

我不确定如何实现这与Angular2和观察。我可以从这些帖子中看到,为了模仿promise,可观察性基本上只是使用订阅()而不是然后()

角度1。x$q到角度2.0测试版

但是,在应用程序可以继续之前,我如何等待foreach循环中的所有调用完成呢?

共有2个答案

长孙鸿振
2023-03-14

在RxJS v6和更高版本中,您可以使用zip更有力地实现这一点。

    import { zip } from 'rxjs';

    const promise1 = yourSvc.get(yourFavoriteAPI.endpoint1);
    const promise2 = yourSvc.get(yourFavoriteAPI.endpoint2);

    const promises = zip(promise1, promise2);

    promises.subscribe(([data1, data2]) => {
      console.log(data1);
      console.log(data2);
    });

虽然结果是相同的,但我发现zipforkJoin更可取,因为zip更通用,可以处理可观察到的新值。

详细信息从rxjs留档:

zip操作符将订阅所有内部观察值,等待每个观察值发出一个值。一旦发生这种情况,将发出具有相应索引的所有值。这将一直持续到至少一个内部可观察对象完成为止。

陈浩
2023-03-14

我一直在用forkJoin做这件事

import {Observable} from 'rxjs/Observable';
import 'rxjs/add/observable/forkJoin';

Observable.forkJoin(
  this.http.get('./friends.json').map((res: Response) => res.json()),
  this.http.get('./customer.json').map((res: Response) => res.json())
)
.subscribe(res => this.combined = {friends: res[0].friends, customer: res[1]});

更多信息:http://www.syntaxsuccess.com/viewarticle/angular-2.0-and-http

 类似资料:
  • 我有一个加载页面,我想在其中对不相关的信息执行两个网络请求(rxjava)。在这两个请求完成之前,我不想进入下一页,即使其中一个或两个都失败了。 > 使用zip将请求绑定在一起。有没有办法不必被迫使用双函数,也不必返回null? 请求A和B有一个。doOnNext和。多恩。如果其中一个返回错误,zip observable是否继续?zip订阅服务器是否也会返回错误? 这是最好的方法吗?

  • 在一个服务中,我有两个API调用,每个调用都返回一个可观察的,在我的组件中,我有一些条件,如果为true,我必须调用这两个函数,但我需要等待get()调用,这样我就可以使用get调用返回的参数执行post函数。如果为false,我只想用已经定义的参数调用post函数。 服务: 组成部分: 我不想重复帖子调用的代码,或者如果不可能的话,只是不要在另一个订阅()中使用订阅()。我怎么能这么做?没有异步

  • 问题内容: 我正在尝试在Node.js / Express中创建一个路由,该路由从两个查询中读取数据,然后基于来自查询的数据来增加计数。由于Node.js是异步的,因此在读取所有数据之前会显示总计。 我创建了一个简单的示例,以达到我目前正在做的事情 我不确定要等到两个功能都完成后才能打印总计,我该做什么。我是否需要创建一个自定义事件发射器来实现这一目标? 问题答案: 拥抱异步性: 或使用Promi

  • 我有两个JS函数。一个叫另一个。在调用函数中,我想调用另一个函数,等待该函数完成,然后继续。例如,伪代码: 我想出了这个解决方案,但不知道这是否是一个明智的方法。 这合法吗?有没有更优雅的处理方法?也许用jQuery?

  • 我有一个方法,可以为WebView的WebEngine设置一个新的网页,需要等到网页加载完成后才能继续使用当前方法。 基本上我想要: 我尝试过使用ChangeListener(),但它只会在我的方法完成执行后执行。我在谷歌上搜索了许多导致更多挫折感的术语,比如“java非阻塞等待布尔值”。最终,我成功地启动了新线程(以防止应用程序GUI锁定)并使用了倒计时(与Thread.join()相反)。下面