【问题标题】:Pass subscribe result to onNext将订阅结果传递给 onNext
【发布时间】:2018-04-27 15:32:14
【问题描述】:

我有一个从网络服务获取一些信息的函数:

const rxjs = require('rxjs');
const request = require('request');
const moment = require('moment');
function getAvailableGroupClasses() {
    return rxjs.Observable.create(observable => {
        request(`https://myservice.com/get.json`, (error, response, body) => {
            const j = JSON.parse(body);
            observable.next(j);
            observable.complete();
        });
    });
}

它返回一个 observable,然后被另一个函数订阅:

function findClassOnDateTime(className, targetDateTime) {
    return rxjs.Observable.create(observable => {
        getAvailableGroupClasses().subscribe(classes => {
            classes.getAllGroupClassesMap
            .filter(value => value.nomeAtividade === className) // filter by name
            .filter(value => moment(`${value.day} ${value.time}`, 'YYYY-MM-DD HH:mm:ss').isSame(momentTargetDateTime, 'minute')) //filter by class date
            .map(values => observable.next(values)) // wrap this in an observable, call here next
        });
    });
}

最后,façade 会像这样调用findClassOnDateTime:

findClassOnDateTime('classname', moment().day(1 + 7).hour(19).minute(20)).subscribe(values => {
    console.log(values);
});

我的问题在于函数 findClassOnDateTime 。它订阅一个 Observable 并创建一个新的来传递值。虽然它正在工作,但我一直在网上阅读 Observables 不应链接或嵌套,但我没有看到任何示例说明何时必须创建 observable 而不仅仅是订阅它。

只是要指出,façade 不应该先调用getAvailableGroupClasses,然后再调用findClassOnDateTime,必须全部在findClassOnDateTime 中完成。

【问题讨论】:

    标签: javascript node.js rxjs observable


    【解决方案1】:

    您可以直接在observable 上使用map、filter 和更多运算符。实际上,每次创建新的 observable 时,您都在重新实现 map 运算符。

    我猜getAllGroupClassesMap 是一个数组。您可以使用 Observable.from 将数组转换为 observable 并链接所有运算符。

    function createHttpObservable(url) {
       return Observable.create(observer => {
          request(url, (error, response, body) => {
             const j = JSON.parse(body);
             observer.next(j);
             observer.complete();
          });
       });
    }
    
    function findClassOnDateTime(className, targetDateTime) {
       return createHttpObservable("https://myservice.com/get.json").concatMap(r => Observable.from(r.getAllGroupClassesMap))
          .filter(value => value.nomeAtividade === className)
          .filter(value => moment(`${value.day} ${value.time}`, 'YYYY-MM-DD HH:mm:ss').isSame(targetDateTime, 'minute'));
    }
    
    findClassOnDateTime("..." , xxxx).subscribe(values =>  console.log(values));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-11-07
      • 2020-08-12
      • 1970-01-01
      • 1970-01-01
      • 2017-10-25
      • 2018-11-06
      • 2023-04-08
      相关资源
      最近更新 更多