通过使用Http,我们调用一个执行网络调用并返回http observable的方法:
getCustomer() {
return this.http.get('/someUrl').map(res => res.json());
}
Run Code Online (Sandbox Code Playgroud)
如果我们采用这个可观察的并添加多个订阅者:
let network$ = getCustomer();
let subscriber1 = network$.subscribe(...);
let subscriber2 = network$.subscribe(...);
Run Code Online (Sandbox Code Playgroud)
我们想要做的是确保这不会导致多个网络请求.
这可能看起来像是一个不寻常的场景,但实际上很常见:例如,如果调用者订阅了observable以显示错误消息,并使用异步管道将其传递给模板,那么我们已经有两个订阅者.
在RxJs 5中这样做的正确方法是什么?
也就是说,这似乎工作正常:
getCustomer() {
return this.http.get('/someUrl').map(res => res.json()).share();
}
Run Code Online (Sandbox Code Playgroud)
但这是在RxJs 5中这样做的惯用方式,还是我们应该做其他事情呢?
注意:根据Angular 5 new HttpClient,.map(res => res.json())所有示例中的部分现在都没用,因为现在默认采用JSON结果.
对我来说,对于RxJs 5 share()运算符的工作原理并不是100%清楚,请参阅最新的文档.Jsbin 这里的问题.
如果我创建一个0到2系列的observable,每个值相隔一秒:
var source = Rx.Observable.interval(1000)
.take(5)
.do(function (x) {
console.log('some side effect');
});
Run Code Online (Sandbox Code Playgroud)
如果我为这个observable创建了两个订阅者:
source.subscribe((n) => console.log("subscriptor 1 = " + n));
source.subscribe((n) => console.log("subscriptor 2 = " + n));
Run Code Online (Sandbox Code Playgroud)
我在控制台中得到这个:
"some side effect ..."
"subscriptor 1 = 0"
"some side effect ..."
"subscriptor 2 = 0"
"some side effect ..."
"subscriptor 1 = 1"
"some side effect ..."
"subscriptor 2 = 1"
"some side effect ..."
"subscriptor 1 = 2"
"some …Run Code Online (Sandbox Code Playgroud) 我使用Stripe Checkout.js来创建付款.我正在创建一个处理程序,成功时会向服务器发送一个令牌:
let handler = StripeCheckout.configure({
key: 'my_key',
image: 'image.png',
locale: 'auto',
token: token => {
console.log(token.id);
// ... send token to server
}
});
Run Code Online (Sandbox Code Playgroud)
然后我使用处理程序创建一个令牌:
handler.open({
name: 'Test',
description: 'test',
billingAddress: false,
currency: 'eur',
amount: '1200',
});
Run Code Online (Sandbox Code Playgroud)
这个处理程序触发测试checkout.js弹出窗口,我填写并单击Pay.它成功结束,意味着按钮显示为绿色.
但是,在按钮显示绿色的那一刻,以及将令牌打印到控制台的那一刻(在处理程序成功回调上),会抛出错误:
EXCEPTION:TypeError:将循环结构转换为JSON
stacktrace的主要部分是:
TypeError: Converting circular structure to JSON
at Object.stringify (native)
at Object.stringify (http://localhost:5000/dist/client/bundle.js:46294:29)
at RPC.sendMessage (https://checkout.stripe.com/checkout.js:1:18068)
at RPC.sendMessage (https://checkout.stripe.com/checkout.js:1:16180)
at https://checkout.stripe.com/checkout.js:1:17137
at RPC.ready (https://checkout.stripe.com/checkout.js:1:17416)
at RPC.invoke (https://checkout.stripe.com/checkout.js:1:17084)
at RPC.invoke (https://checkout.stripe.com/checkout.js:1:16180)
at RPC.processMessage (https://checkout.stripe.com/checkout.js:1:18899)
at RPC.processMessage (https://checkout.stripe.com/checkout.js:1:16180)
Run Code Online (Sandbox Code Playgroud)
通过检查代码,我们看到问题在这里:
RPC.prototype.sendMessage = …Run Code Online (Sandbox Code Playgroud) 我们最近将hibernate升级4.0.1为4.2.8.Final.
Hibernate.4.2.8.Final取决于javassist-3.18.1-GA.不幸的是,websphere 8.5.5并没有附带最新的javassist,但它不是我的问题.我试图强制websphere采取我的javassist jar,但我失败了(由于某种原因它总是加载${WAS_INSTALL_ROOT}/plugins).
我尝试了什么?
${WAS_INSTALL_ROOT}/lib/ext但没用${WAS_INSTALL_ROOT}/plugins然后应用程序开始工作但这不是一个好的解决方案,因为其他Web应用程序可能依赖于旧的javassist我的问题
如何在Websphere 8.5.5中使用(或注入或引用)最新的javassist jar?
这个#blog帮助我很快解决了这个问题.
我们如何在RxJs 5中将主题转换为Observable?此功能非常有用,例如,当我们希望公开Subject以进行订阅但又不想控制对其进行调用next()时,并且更愿意保持新值的发布.
文档(见这里)提到这样的事情:
var subject = new Rx.Subject();
var obs = subject.asObservable();
Run Code Online (Sandbox Code Playgroud)
但是在RxJs 5中这当前不起作用(alpha 8),我们得到以下错误:
"TypeError: subject.asObservable is not a function
Run Code Online (Sandbox Code Playgroud) rxjs ×3
rxjs5 ×3
angular ×2
classloader ×1
hibernate ×1
java ×1
javascript ×1
javassist ×1
websphere ×1