小编Bra*_*don的帖子

等待RxJS Observable的onNext中的异步操作

我有正常方式消耗的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)

javascript asynchronous rxjs

29
推荐指数
2
解决办法
2万
查看次数

获取RxJS Observable的最后两个值之间的差异

我有一个可观察的跟踪滚动位置

 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)

如何实现这样的事情?我试过扫描没有成功.谢谢

javascript rxjs

19
推荐指数
2
解决办法
1万
查看次数

如何用RxJS对数据变化做出"反应"?

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).

javascript rxjs

10
推荐指数
1
解决办法
7105
查看次数

RxJS捕获**并**重试一个Observable

我的用例是将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已经做的任何事情.

javascript rxjs redux

8
推荐指数
1
解决办法
3829
查看次数

RxJS中的同步性

我希望以下代码将异步运行:

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

6
推荐指数
1
解决办法
5084
查看次数

我如何重复ajax请求,直到RxJS Observable满足条件?

我正在尝试重复请求,直到响应使用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的新手。

javascript rxjs reactivex rxjs5

6
推荐指数
3
解决办法
2818
查看次数

java.lang.IllegalStateException:使用片段销毁了活动

两天了,我正试图解决这个问题.我在网上和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)

android android-fragments actionbarsherlock

5
推荐指数
0
解决办法
3663
查看次数

使用 RxJs groupBy 将对象作为键

我正在尝试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)

是我想写的,但没有运气,我为第三个回调所做的一切都没有被调用。

这里有什么问题?

javascript rxjs

5
推荐指数
1
解决办法
1849
查看次数

react-bootstrap:清除元素值

我试图在onClick事件发生后清除我的输入字段。

我正在使用react-bootstrap库,虽然有getValue()方法,但没有setValue(value)方法。

我偶然发现了这个讨论

为了在提交后简单地清理表单,我不完全理解他们的建议。

毕竟,如果我使用简单的 HTML<input>而不是react-bootstrap我可以通过元素获取节点ref并将其值设置为空字符串或其他东西。

什么被认为是清理 react-bootstrap<Input />元素的反应方式?

javascript reactjs react-bootstrap redux

4
推荐指数
1
解决办法
1万
查看次数

Rx如何真正在Web上工作(客户端)

我已经阅读了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的工作就完成了?

javascript reactive-programming rxjs

3
推荐指数
1
解决办法
1647
查看次数