gpt4 book ai didi

cyclejs - Cycle.js 添加加载指示器后 HTTP 发送多个请求

转载 作者:行者123 更新时间:2023-12-02 12:01:37 25 4
gpt4 key购买 nike

我一直在尝试创建一些cycle.js 示例作为嵌套对话,并使用选择框在它们之间进行切换。

其中一个对话是官方 Github HTTP 搜索示例的克隆。

另一个对话是一个更基本的对话,没有 HTTP,只有 DOM。

我觉得我一直在思考两者之间的切换,但我对 Rx 还很陌生,所以这可能会做得不正确或天真。

一切似乎都很顺利,直到我向搜索页面添加了加载指示器。

为此,我将其转变为:

  const vTree$ = responses.HTTP
.filter(res$ => res$.request.indexOf(GITHUB_SEARCH_API) === 0)
.flatMapLatest(x => x)
.map(res => res.body.items)
.startWith([])
.map(results =>
h('div.wrapper', {}, [
h('label.label', {}, 'Search:'),
h('input.field', {type: 'text'}),
h('hr'),
h('section.search-results', {}, results.map(resultView)),
])
)

进入此:

  const searchResponse$ = responses.HTTP
.filter(res$ => res$.request.indexOf(GITHUB_SEARCH_API) === 0)
.flatMapLatest(x => x)
.map(res => res.body.items)
.startWith([])

const loading$ = searchRequest$.map(true).merge(searchResponse$.map(false))

// Convert the stream of HTTP responses to virtual DOM elements.
const vtree$ = loading$.withLatestFrom(searchResponse$, (loading, results) =>
h('div.wrapper', {}, [
h('label.label', {}, 'Search:'),
h('input.field', {type: 'text'}),
h('span', {}, loading ? 'Loading...' : 'Done'),
h('hr'),
h('section.search-results', {}, results.map(resultView)),
])
)

我现在有 2 个问题

  1. 记录“复选框值设置为”和“路线已更改”消息每次更改复选框两次。
  2. 仅 HTTP 请求日志触发一次,但如果您在开发工具中观察网络事件您将同时看到两个 GET 请求。

感谢您的帮助!

编辑:解决了我自己的问题。请参阅下面的答案。

最佳答案

我最终通过从头开始重建整个应用程序直到找到断点来解决这个问题。

我了解到,您需要将 .share() 添加到任何可观察流,该流将被多个下游可观察量订阅/映射等。

  const searchRequest$ = DOM.select('.field').events('input')
.debounce(500)
.map(ev => ev.target.value.trim())
.filter(query => query.length > 0)
.map(q => GITHUB_SEARCH_API + encodeURI(q))
.share() //needed because multiple observables will subscribe

// Get search results from HTTP response.
const searchResponse$ = HTTP
.filter(res$ => res$ && res$.request.url.indexOf(GITHUB_SEARCH_API) === 0)
.flatMapLatest(x => x) //Needed because HTTP gives an Observable when you map it
.map(res => res.body.items)
.startWith([])
.share() //needed because multiple observables will subscribe

//loading indication. true if request is newer than response
const loading$ = searchRequest$.map(true).merge(searchResponse$.map(false))
.startWith(false)
.share()

//Combined state observable which triggers view updates
const state$ = Rx.Observable.combineLatest(searchResponse$, loading$,
(res, loading) => {
return {results: res, loading: loading}
})

//Generate HTML from the current state
const vtree$ = state$
.map(({results, loading}) =>
.........

关于cyclejs - Cycle.js 添加加载指示器后 HTTP 发送多个请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34094305/

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