rxjs创建异步数据的Observable

interval和timer:定时产生数据

interval的参数是1000,在1秒的时刻吐出0,2s吐出1,3s吐出2,........

这个数据流不会完结,因为interval不会主动调用下游的complete,要想停止这个数据的序列,必须要做退订的动作。

import { Observable } from ‘rxjs‘;
import ‘rxjs/add/observable/interval‘....
  let source$ = Observable.interval(1000);

  source$.subscribe(
    console.log,
    null,
    ()=>console.log(‘complete‘)
  )
  ....
import { interval } from ‘rxjs‘;
let source$ = interval(2000);

timer第一个参数可以是一个数值,代表毫秒数,在指定毫秒数之后吐出一个数据0.

import { timer } from ‘rxjs‘;
let source$ = timer(1000);

timer第一个参数也可以是一个Date类型的对象

const later = new Date (Date.now() + 1000)
  let source$ = timer(later);

timer支持第二参数,表示时间间隔。相当于interval的数据流,从0开始,每次1s递增1。

let source$ = timer(2000,1000);

from:可把一切转化为Observable

参数可以是数组

import { from } from ‘rxjs‘;

let source$ = from([1,2,3]);

参数可以是arguments,长得像数组的,也可以被from处理

function toObservable(){
  return from(arguments)
}
let source$ = toObservable(1,2,3);

参数可以是字符串。

let source$ = from(‘123‘);

输出结果都是:

fromPromise:异步处理的交接

当promise成功完成的时候,from也知道不会再有新的数据了,所以立刻结束。

const promise = Promise.resolve(‘good‘)
let source$ = from(promise);

source$.subscribe(

console.log,

null,

()=>console.log(‘complete‘)

)

输出结果:

如果promise对象失败,from产生的对象也会立刻产生失败事件

const promise = Promise.reject(‘oops‘)
  let source$ = from(promise);

    source$.subscribe(
      console.log,
      error => console.log(‘catch ‘+error),
      ()=>console.log(‘complete‘)
    )

输出结果:

fromEvent

fromEvent的第一个参数是一个事件源,在浏览器中,最常见的事件源就是特定的DOM元素。

第二个参数是事件名称。对应的事件:click,mousemove等这样的字符串。

实例一:点击按钮,div中的数字会增加1

import React from ‘react‘;
import { fromEvent } from ‘rxjs‘;

class FlowPage extends React.PureComponent {
  componentDidMount(){
    let ClickCount = 0;  
    const event$ = fromEvent(document.getElementById(‘clickMe‘),‘click‘);
    event$.subscribe(
      () => {
        document.querySelector(‘#text‘).innerHTML = ++ClickCount;
      }
    )
  }
  render(){
    return ( <div>
        <h1>rxjs学习</h1>
        <button id="clickMe">Click me</button>
        <div id="text">0</div>
    </div> ) ;
  }

};

export default FlowPage;

fromEvent还可以从Node.js的events中获得数据。

import React from ‘react‘;
import { fromEvent } from ‘rxjs‘;
import { EventEmitter } from ‘events‘;

const FlowPage = () => {  // nodeJS自带的事件发射器,构造出事件发射器实例emitter
  const emitter = new EventEmitter();
  const source$ = fromEvent(emitter,‘msg‘)

  source$.subscribe(
    console.log,
    null,
    ()=>console.log(‘complete‘)
  )
 // emitter的emit函数可以发送任何名称的事件,第一个参数就是事件名称,第二个参数是事件对象。
  emitter.emit(‘msg‘,‘1‘)
  emitter.emit(‘msg‘,‘2‘)
  emitter.emit(‘another msg‘,‘oops‘)
  emitter.emit(‘msg‘,‘3‘)
  return <h1>rxjs学习</h1>;
};

export default FlowPage;

执行结果:

结论:没有输出事件名为another msg的oops结果。

因为another msg没有计入source$,fromEvent的第二个参数明确指定只接受msg类型的事件。

注意:source$添加了Observer之后再去调用emitter.emit。否则Observer什么都接受不到。

原文地址:https://www.cnblogs.com/hibiscus-ben/p/12400768.html

时间: 2024-10-09 04:34:55

rxjs创建异步数据的Observable的相关文章

rxjs - 创建异步数据的Observable对象

一.interval和timer:用于定时产生数据 interval说明:它接收一个数值类型的参数,表示产生数据的间隔时间,单位为毫秒,返回的Observable对象就按照这个时间间隔来产生递增序列,从0开始,但是有限制. timer说明:第一个参数若为数值则单位为毫秒,表示间隔时间,产生一个数据0立即结束,若为Date类型的对象,则表示到这个时间点执行,第二个参数若传入,则类似于interval,表示产生数据的时间间隔,但是产生0的时间仍然是由第一个参数决定. 二.from:可把一切转成Obs

EasyUI创建异步树形菜单和动态添加tab页面

创建异步树形菜单 添加树形菜单的ul标签 <ul class="easyui-tree" id="treeMenu"> </ul> 写js代码,对菜单的ul标签元素使用tree函数 $('#treeMenu').tree({ url:'tree_data.json' //url的值是异步获取数据的页面地址 }); 写用来异步获取数据的页面(tree_data.json页面).返回的需是Json值(此处用数组代替从数据库获取的数据,以省略连接数

iOS中plist的创建,数据写入与读取

iOS中plist的创建,数据写入与读取功能创建一个test.plist文件,textInput作为输入,displayLabel作为显示,有一个按钮来触发保持程序triggerStorage: -(void)triggerStorage { displayLabel.text = textInput.text; NSArray *paths=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES)

默认加载数据分页,点击分页后再次异步数据

一.前言 现在主流的分页插件很多是一次性把数据加载完成,再本地分页,切换时候是Tab效果,数据量大or网络不通畅的时候,就会很卡影响加载效果. 实现每页加载固定条数及点击分页再次请求数据,假设共100条数据,一页10条的话共10页.需要后端配合每页显示全部的条数及每页条数. 二.后端数据 根据pageNum=1查询,返回json数据 count数据总数 pageNum 第一页 pageSize 每页10条 三.代码 分页代码: function(e) { function s() { this.

蜗牛爱课- iOS中plist的创建,数据写入与读取

iOS中plist的创建,数据写入与读取功能创建一个test.plist文件-(void)triggerStorage{    NSArray *paths=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);    NSString *path=[paths    objectAtIndex:0];      NSString *filename=[path stringByAppendin

PHP创建数据库数据表

PHP创建数据库数据表 <?php $con = mysql_connect('localhost', 'root', 'root'); /************************在数据库中创建表*************************/ if (!$con) { die ('连接数据库出错: ' . mysql_error()); } $database="my_db_name"; $sqlDatabase = 'create database '.$data

DevExpress XtraReports 入门二 创建 data-aware(数据感知) 报表

原文:DevExpress XtraReports 入门二 创建 data-aware(数据感知) 报表 本文只是为了帮助初次接触或是需要DevExpress XtraReports报表的人群使用的,为了帮助更多的人不会像我这样浪费时间才写的这篇文章,高手不想的看请路过 本文内容来DevExpress XtraReports帮助文档,如看过类似的请略过. 废话少说 开始正事 一.创建应用程序并添加报表 启动 MS Visual Studio (2005.2008.或 2010). 在 Visua

opennebule 创建cdrom数据发送

{"image":{"NAME":"aaa","DESCRIPTION":"aaa","TYPE":"CDROM","PERSISTENT":"NO","PATH":"/opt/TinyLInux.iso"},"ds_id":"116","

C#异步数据接收串口操作类

C#异步数据接收串口操作类 使用C#调用传统32位API实现串口操作,整个结构特别的简单.接收数据只需要定义数据接收事件即可. 上传源代码我不会,需要源代码的请与我([email protected])联系.你也可以教我怎么上传源代码. using System; using System.Runtime.InteropServices; /// <summary> /// (C)2003-2005 C2217 Studio  保留所有权利 /// /// 文件名称:     IbmsSeri