【发布时间】:2025-12-19 02:15:07
【问题描述】:
我一直在尝试创建一个简单的测试应用程序,该应用程序从文本字段中获取用户输入,显示它,并使用cycle-idb 将其持久化。但无论我做什么,我都会陷入无限循环。
这是整个主要功能:
function intent(domSources) {
return domSources.select('.name')
.events('input')
.map(ev => ev.target.value);
};
function model(input$, db$) {
const log$ = db$;
return xs.combine(input$, log$)
.map(([input, logs]) => {
return {
id: 1,
name: input,
}
}).startWith({id: 1, name: ""});
};
function view(state$) {
return state$.map(log => {
return (
<div>
<label for='name'>Name: </label>
<input
className='name'
type='text'
value={log.name}
placeholder="Enter a log name"
/>
<p>{log.name}</p>
</div>
)
});
};
function persist(state$) {
return state$.map(log => {
return $put('logs', log)
});
};
export function main (sources) {
const db$ = sources.IDB.store('logs').getAll();
const input$ = intent(sources.DOM);
const state$ = model(input$, db$);
const vtree$ = view(state$);
const updateDb$ = persist(state$);
return {
DOM: vtree$,
IDB: updateDb$,
};
}
我正在尝试使用 MVI 并以 TodoMVC 为例,但我不知道如何在不创建无限循环的情况下管理循环依赖项。
任何建议或指向其他参考资料将不胜感激。
【问题讨论】:
-
它应该不会有什么不同,但你可以尝试用
sampleCombine代替take(1)和combine吗? -
谢谢@JanvanBrügge,是的,可能不会,尽管我觉得我的问题确实涉及能够从数据库中获取一次更新,从那时起,只更新数据库,而不是另一个一路走来。
-
编辑此内容以删除
take(1)... 错误版本的代码,这会停止无限循环,但会中断数据库更新
标签: javascript cyclejs