Rxjs 使用“cycle http”生成任意数量的顺序相关请求`

Rxjs 使用“cycle http”生成任意数量的顺序相关请求`,rxjs,cyclejs,Rxjs,Cyclejs,是否有使用循环http生成任意数量的连续、依赖的http请求的示例 我想从API中获取每个页面,其中下一个请求只能使用当前页面中的数据进行 我已经尝试使用Observable.merge来调整它,但我不确定如何将其连接到循环http源和汇 参考资料 如果您提供一些代码示例会更好。然而,基本逻辑可能是这样的: 将响应流映射到请求流 使用初始请求启动请求流 代码如下所示: 功能主要来源{ 常量初始请求={ 网址:'http://www.google.com' }; const request$=s

是否有使用循环http生成任意数量的连续、依赖的http请求的示例

我想从API中获取每个页面,其中下一个请求只能使用当前页面中的数据进行

我已经尝试使用Observable.merge来调整它,但我不确定如何将其连接到循环http源和汇

参考资料
如果您提供一些代码示例会更好。然而,基本逻辑可能是这样的:

将响应流映射到请求流 使用初始请求启动请求流 代码如下所示:

功能主要来源{ 常量初始请求={ 网址:'http://www.google.com' }; const request$=sources.HTTP .filterresponse$=>/*过滤器逻辑在此处*/ .switch//或者您可以使用flatMap .mapresponse=>/*将响应映射到新请求*/ .startWithinitialRequest; 返回{ HTTP:请求$ };
} 所以这可能是可怕的过度复杂,我应该放弃它 试一试 但这是我想到的

用法 导出默认函数app{HTTP}{ 常数{ allPagesRequest$:StaffPagesRequest$, 最新数据$:人员$, }=getAllPages{url:'/staff',HTTP}; //职员$已转换为vdom。。。 返回/*接收器*/{ DOM:staffPagesReq$, HTTP:staffVdom$, } } 实施 常量fetchNthPage=optin=>{ const opts=合并 { 网址:, 页码:0, HTTP:未定义, },奥普钦 ; const u=新的URIopts.url .setQuery{''u page':opts.page.toString}; const pageNResponse$=opts.HTTP 滤器 res$=>res$.request.url===urlForEndpointu .平面图 res$=>res$.catch err=>可观察的 { 正文:{'error in response:':err.toString} } .mapres=>res.body .take1 .股份1; 可观测收益{ pageNRequest$:可观察到的基本任务, pageNResponse$:pageNResponse$, 选项:选项 }; }; const-capsulateas=typeName=>data=>{ 返回{type:typeName,data} }; const fetchallpagesindivaly=optin=>{ const opts=合并 { 网址:, 页码:0, HTTP:未定义, }, 视蛋白 ; 返回可观察的延迟 =>fetchNthPageopts .flatmappx=>{ const mergedItems$=可观测 合并 x、 pageNRequest$.MapEn封装为'request', x、 pageNResponse$.mapEn封装为“响应” ; const optsForNextPage=mergeopts{ 页码:opts.page+1 }; const next$=可观测 .never/`next$`不应在`pageNResponse$`结束时结束 .mergex.pageNResponse$ .shareReplay1 .takewhilers=>{ //无不必要的局部变异性检查 让isFullPage=path['response','length',res==apiPageSize; 返回全页; } .flatMap=>{ 返回fetchAllPagesIndividuallyoptsForNextPage }; //无不必要的局部变异性检查 const concattedItem$=可观测 康卡特先生 mergedItems$, 下一个$ ; 返回concattedItem$ } .shareReplay1 ; }; const concatPages=acc,currentVal,index,source=>acc.concatcurrentVal; 常量typeIs=typeStr=>compose equalstypeStr, 道具‘类型’ ; 常量typeNotIn=typesArray=>compose 不 一元数组, 道具‘类型’ ; const getAllPages=optin=>{ 常量f$=fetchAllPagesIndividuallyoptsIn .股份1; const allPagesRequest$=f$ .FilterType为“请求” .mapprop“数据”; const allPagesResponse$=f$ .FilterType为“响应” .mapprop“数据”; 常数$=f$ .filtertypeNotIn[“请求”、“响应”、“数据”]; const latestData$=所有页面响应$ .mapprop“响应” .ScanContpages; 返回{ allPagesRequest$, 所有页面响应$, 最新数据$, 剩余美元, } };
compose、not、merge、one-ary等都来自

下面是另一个关于使用@cycle/fetch驱动程序的任意数量的顺序相关请求的例子

使用用户API。用户查询每页返回30个用户,因为URL参数是用户id号,并从下一个用户id开始查询

首先是带注释的主要功能的主要部分:

const listResponse$=sources.FETCH//FETCH驱动程序返回的响应 .mergeAll .flatMapres=>res.json 扫描 userstotals,users=> [ userstotals[0]+1,//页面计数 users[29]&&users[29]。id,//整页上的最后一个id userstotals[2]。concatusers//收集所有用户 ] , [0,未定义,[]//默认累加器 .分享;//允许流拆分 //分支1-再次循环以获取更多页面 常量listRequest$=listResponse$ .filterusers=> 0<用户[1]&&//已满 页面id存在 maxpages>用户[0];//小于maxpages .startWith'initial' .mapusers=> `https:\/\/api.github.com/users?自=${ !isNaNparseIntusers[1],10&&users[1]| |//最后一个id完整页 idstart//默认id开始 }` ; //分支2-显示 const dom$=listResponse$ .mapuserstotals=>divJSON.stringifyuserstotals[2]; 这是一个更新的答案。我意识到扫描可以合并成一个

说明:首先从sources属性FETCH中提取响应,将其展平并提取JSON,然后扫描以计算到目前为止已查询的页面数。稍后将查询的页数与maxpages进行比较,以便不超过预定的页数。接下来,获取完整页面的最后一个id(如果存在),最后,使用到目前为止累积的用户页面集合,查看当前用户页面。在累积响应信息后,共享流,以便将其分为两个分支

第一个分支用于通过FETCH驱动程序重新循环查询,以查询更多页面。但首先要检查最后一页和查询的页数。如果id不是数字,则已到达最后一页。如果已到达最后一页,因此没有更多页面可查询,请不要继续。如果查询的页数超过maxpages的值,也不要继续

第二个分支只需进入累积响应以获得完整的用户列表,然后JSON.stringify对象并将其转换为虚拟dom对象div方法,以发送给dom驱动程序进行显示

下面是完整的脚本:

从'@Cycle/rx run'导入周期; 从'@cycle/dom'导入{div,makeDOMDriver}; 从'@cycle/fetch'导入{makeFetchDriver}; 函数mainsources{//提供属性DOM和获取evt.streams const acctok=;//如果需要,请将您的令牌放在这里 const idstart=19473200;//要从何处开始? 常量maxpages=10; const listResponse$=sources.FETCH .mergeAll .flatMapres=>res.json 扫描 userstotals,users=> [ userstotals[0]+1,//页面计数 users[29]&&users[29]。id,//整页上的最后一个id userstotals[2]。concatusers//收集所有用户 ] , [0,未定义,[] 共有 常量listRequest$=listResponse$ .filterfunction用户{ 返回0users[0]; } .startWith'initial' .mapusers=> `https:\/\/api.github.com/users?自=${ !isNaNparseIntusers[1],10&&users[1]| |//最后一个id完整页 idstart//默认id开始 }`//&access_令牌=${acctok}` ; const dom$=listResponse$ .mapuserstotals=>divJSON.stringifyuserstotals[2]; 返回{ DOM:DOM$, 获取:listRequest$ }; } Cycle.runmain{ DOM:makeDOMDriver'main-container', FETCH:makeFetchDriver }; 我的第一个答案,留给子孙后代。注意这两次扫描

const listResponse$=sources.FETCH .mergeAll .flatMapres=>res.json .scanuserscount,users=>//users[0]; } .startWith'initial' .mapusers=> `https://api.github.com/users?since=${ 用户[1][users[1].length-1]&&users[1][users[1].length-1].id|| idstart }` ; const dom$=listResponse$ .scanfunction usersall,users{//divJSON.stringifyres;
通过提前扫描一次,我需要获取完整的页面最后一个id(如果存在),并将其存储在累加器中。

我认为困难在于,如果使用cycle.js驱动程序来发出每个后续请求,那么如何将每个请求中的数据向前传输到下一个周期?@cycle/fetch使用任意键/值,这些键/值通过t可以在requests属性返回时检索驱动程序cycle。