我正试图通过迁移当前使用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
循环中的所有调用完成呢?
在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);
});
虽然结果是相同的,但我发现zip
比forkJoin
更可取,因为zip
更通用,可以处理可观察到的新值。
详细信息从rxjs留档:
zip操作符将订阅所有内部观察值,等待每个观察值发出一个值。一旦发生这种情况,将发出具有相应索引的所有值。这将一直持续到至少一个内部可观察对象完成为止。
我一直在用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()相反)。下面