我有正常方式消耗的RxJS序列......
但是,在可观察的'onNext'处理程序中,某些操作将同步完成,但其他操作需要异步回调,需要在处理输入序列中的下一个项之前等待.
......有点困惑如何做到这一点.有任何想法吗?谢谢!
someObservable.subscribe(
function onNext(item)
{
if (item == 'do-something-async-and-wait-for-completion')
{
setTimeout(
function()
{
console.log('okay, we can continue');
}
, 5000
);
}
else
{
// do something synchronously and keep on going immediately
console.log('ready to go!!!');
}
},
function onError(error)
{
console.log('error');
},
function onComplete()
{
console.log('complete');
}
);
Run Code Online (Sandbox Code Playgroud) 我有一个可观察的跟踪滚动位置
const scroll = Observable
.fromEvent(document, 'scroll')
.map(e => window.pageYOffset)
.startWith(0)
Run Code Online (Sandbox Code Playgroud)
我想有第二个观察跟踪滚动增量 (newScroll - lastScroll)
const scrollDelta = scroll
// ???
.subscribe(delta => console.log('delta:', delta) )
Run Code Online (Sandbox Code Playgroud)
如何实现这样的事情?我试过扫描没有成功.谢谢
RxJS初学者:我在使用RxJS保存和跟踪数据更改时遇到问题.假设我在小视图/小部件中构建我的应用程序,并且每个视图/小部件都有自己的状态,应该对数据更改执行操作.我怎么做?
更具体的例子.假设我有一个名为的小部件,Widget并且Widget有一个标题和按钮.如果已单击按钮,则状态应包含标题和信息.从阅读RxJS的文档看,这似乎是一个很好的起点:
var widgetState = new Rx.Subject().startWith({
wasClicked: false,
title: 'foo'
});
Run Code Online (Sandbox Code Playgroud)
现在我希望在某些数据发生变化时收到通知:
var widgetStateChanges = widgetState.subscribe(function(data) {
console.log('data: ', data);
// what do i do with the data here?
// i would like to merge the new data into the old state
});
widgetStateChanges.onNext({ title: 'bar' });
Run Code Online (Sandbox Code Playgroud)
我听到了变化,但我不知道如何保存它们.如果发生某些数据变化,我还想做一些特别的事情.像这样的东西.
widgetStateChanges.filter(function(e) {
return e.wasClicked;
}).do(function(e) {
console.log('Do something because was clicked now.');
});
Run Code Online (Sandbox Code Playgroud)
但是我不能filter订阅(widgetStateChanges),只能是一个subject(widgetState).
我的用例是将Observable映射到redux成功和失败的操作.我进行网络调用(带有承诺的函数),如果成功,我必须转发成功操作,如果失败而不是错误操作.Observable本身将继续前进.对于我可以搜索的所有内容,RxJS没有用于捕获错误并重试原始文件的机制.我在我的代码中有以下解决方案,我不满意:
error$ = new Rx.Subject();
searchResultAction$ = search$
.flatMap(getSearchResultsPromise)
.map((resuls) => {
return {
type: 'SUCCESS_ACTION',
payload: {
results
}
}
})
.retryWhen((err$) => {
return err$
.pluck('query')
.do(error$.onNext.bind(error$));
});
searchErrorAction$
.map((query) => {
return {
type: 'ERROR_ACTION',
payload: {
query,
message: 'Error while retrieving data'
}
}
});
action$ = Observable
.merge(
searchResultAction$,
searchErrorAction$
)
.doOnError(err => console.error('Ignored error: ', err))
.retry();
action$.subscribe(dispatch);
Run Code Online (Sandbox Code Playgroud)
即我创建一个主题,并将错误推送到该主题并从中创建一个Observable错误操作.
在RxJS中有一个更好的替代方法吗?基本上我想发出一个错误发生的通知,然后继续Observable已经做的任何事情.
我希望以下代码将异步运行:
var range = Rx.Observable.range(0, 3000000);
range.subscribe(
function(x) {},
function(err) {},
function() {
console.log('Completed');
});
console.log('Hello World');
Run Code Online (Sandbox Code Playgroud)
但事实并非如此.需要一段时间才能完成大范围的数字,只有当它完成后才能恢复执行,你可以在这里尝试代码.
我很困惑何时期望RxJS同步或异步地运行.它取决于使用的方法吗?我之前的想法是,一旦我们进入Observables/Observer土地,其中的所有内容都是异步运行的,类似于承诺的工作方式.
javascript asynchronous system.reactive reactive-extensions-js rxjs
我正在尝试重复请求,直到响应使用RxJS包含数据为止,这时我想调用成功(或失败)处理程序,但是我在使用RxJS时遇到了麻烦。这是我目前的方法:
// ... redux-observable action observable
.mergeMap(() =>
fetchData()
.repeatWhen(response =>
response.takeWhile(({ data }) => !data.length)
.of(response)
)
)
.map(successFunction)
.catch(failureFunction);
Run Code Online (Sandbox Code Playgroud)
免责声明:我是RxJS的新手。
两天了,我正试图解决这个问题.我在网上和stackoverflow上搜索过,但我找不到我的问题的答案.
在我的应用程序中,我正在尝试实现两个选项卡.一个需要显示一个地图,在另一个选项卡中我将显示一个列表适配器.(使用ActionBarSherlock)
当我单击第二个选项卡然后单击第一个选项卡时,我得到一个例外:
10-08 01:27:45.203:E/AndroidRuntime(7082):java.lang.IllegalStateException:活动已被破坏
这是我的活动代码和我的片段类.(仅用于测试,我将CustomMapFragment类放两次).
public class MapActivity extends SherlockFragmentActivity implements LocationListener,TabListener{
LatLng mLocation;
GoogleMap map;
//CustomMapFragment fragment1 = new CustomMapFragment();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//FragmentManager fm = getSupportFragmentManager();
if (savedInstanceState == null) {
setContentView(R.layout.activity_main);
FragmentManager fm = getSupportFragmentManager();
setActionBar();
//fragment2 = new Fragment2();
//FragmentTransaction ft = fm.beginTransaction();
//ft.add(R.id.container, fragment1, "frag1");
//ft.add(R.id.fragment_container, fragment2, "frag2");
//ft.commit();
}
}
private void setActionBar() {
ActionBar actionBar = getSupportActionBar();
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
CustomMapFragment frag1 = new CustomMapFragment();
CustomMapFragment frag2 = …Run Code Online (Sandbox Code Playgroud) 我正在尝试groupBy与 RxJs一起使用,我需要使用对象作为键。如果我不这样做并且我使用,例如,像这样的简单字符串:
var types = stream.groupBy(
function (e) { return e.x; }); //x is a string
Run Code Online (Sandbox Code Playgroud)
然后一切顺利,我的订阅被调用一次,并且只为每个不同的键调用一次。但是,如果我尝试使用对象,则会为 中的每个元素调用订阅stream,即使键恰好与之前的键相同。
对象相等性当然存在问题,但这是我感到困惑的地方,因为我不明白如何使用groupBy. 最新版本的文档说有第三个参数可以是comparer,但它永远不会被调用。早期的文档谈到了一个完全不同的想法的关键序列化器,但两种方法都不适合我。
查看 Rx 源代码,我看到尝试检查getHashCode函数,但我没有找到有关它的文档。像这样的代码:
var types = stream.groupBy(
function (e) {
return { x: e.x, y: e.y }; //is this valid at all?
},
function (e) { return e; },
function (...) { return ???; }); //what am I supposed to do here?
Run Code Online (Sandbox Code Playgroud)
是我想写的,但没有运气,我为第三个回调所做的一切都没有被调用。
这里有什么问题?
我试图在onClick事件发生后清除我的输入字段。
我正在使用react-bootstrap库,虽然有getValue()方法,但没有setValue(value)方法。
我偶然发现了这个讨论。
为了在提交后简单地清理表单,我不完全理解他们的建议。
毕竟,如果我使用简单的 HTML<input>而不是react-bootstrap我可以通过元素获取节点ref并将其值设置为空字符串或其他东西。
什么被认为是清理 react-bootstrap<Input />元素的反应方式?
我已经阅读了Rx CodePlex页面的介绍部分.我看过CascadiaJS的视频.我发现了如何使用RxJS库.我有一个问题是如何帮助我使用现有的Ajax应用程序,我需要在服务器端和客户端更改以充分利用RxJS.
场景 我有一个使用ASP.NET Web API编写的REST服务.该服务当前有一个方法,它采用一个坐标数组并返回另一个坐标数组.因此调用非常简单,就像这样.
$.ajax({
url: "http://www.myservice.com/service1/",
type: "POST",
data: JSON.stringify(params),
contentType: "application/json;charset=utf-8",
success: handle_success,
error: handle_failure,
OPTIONS: null,
});
Run Code Online (Sandbox Code Playgroud)
现在,上面的调用只是调用REST服务,并对结果如何产生采取适当的操作.
有了Rx,我听到了"推"而不是拉的咒语.我们如何在上面的示例中使用"Push"?我是否要将我的REST服务更改为一个Listening TCP Socket,我的网页将保持连接(或进行Keep-Alive连接),新值将被"推送".或者这只是一个如上所述的服务调用,但成功/错误只是通过Observable"引导",一旦调用完成,该Observable的工作就完成了?