gpt4 book ai didi

javascript - 将订阅结果传递给 onNext

转载 作者:行者123 更新时间:2023-11-30 20:33:39 24 4
gpt4 key购买 nike

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

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();
});
});
}

它返回一个可观察对象,然后由另一个函数订阅:

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
});
});
}

最后,外观将像这样调用 findClassOnDateTime:

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

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

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

最佳答案

您可以直接在 observable 上使用 mapfilter 和更多运算符。实际上,每次创建新的可观察对象时,您都在重新实现 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));

关于javascript - 将订阅结果传递给 onNext,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50065744/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com