将json数据加载到CycleJS应用程序中

时间:2016-04-19 13:24:19

标签: javascript cyclejs

我正试图绕着CycleJS,但我被卡住了!我正在尝试将一个小应用程序放在一起,加载包含对象数组的JSON文件,但我无法让应用程序执行http请求

到目前为止我的代码

'use strict';

import Rx from 'rx';
import Cycle from '@cycle/core';
import {h, makeDOMDriver} from '@cycle/dom';
import {makeHTTPDriver} from '@cycle/http';

function intent(DOM) {
    return {
        edit: DOM.select('div')
            .events('click')
            .map(evt => evt.target.value),
        add: DOM.select('div')
            .events('click')
            .map(evt => evt.target.value)
    };
}

function model(actions, response) {
    return response
}

function view(state) {
    return state.map(item => {
        h('div', [
            item.map(todo => h('div', todo.title))
        ])
    });
}

function main(sources) {
    const URL = 'http://localhost:3000/js/planinator/data.json';

    let response = sources.HTTP
        .mergeAll()
        .map(res => res.body)
        .startWith([]);

    const actions = intent(sources.DOM);
    const state = model(actions, response);

    return {
        DOM: view(state),
        HTTP: Rx.Observable.of(URL)
    }
}

Cycle.run(main, {
    DOM: makeDOMDriver('#appmount'),
    HTTP: makeHTTPDriver()
});

我想要实现的是;加载JSON数据并立即将其呈现为div标记。

当我在chrome中运行代码时,我在控制台中得到了这个

bundle.js:14182 TypeError: Cannot read property 'subscribe' of undefined(…)

我已经检查了stackoverflow发现的问题,但他们没有让我更进一步

1 个答案:

答案 0 :(得分:2)

欢迎来到Cycle.js:)

我注意到的第一个问题是,HTTP驱动程序首先会期望一个http请求的Observable,此时你只需要传递一个url字符串。这可以通过使用Rx的Rx.Observable.of(URL)

将URL包装在Observable中来完成
function main(sources) {
  ...
  return {
    ...
    HTTP: Rx.Observable.of(URL)
  }
 }

接下来,我注意到你的request(实际上是你的回复!),有点滥用HTTP驱动程序。 HTTP驱动程序将高阶Observable返回给main,换句话说,它返回包含其他observable的Observable。这可以使用mergeAll()switch()轻松解决。 mergeAll()switch()有效地采用高阶可观察对象,并将其“展平”为包含“内部”可观察事件的可观察对象。

let response = sources.HTTP
  .mergeAll()
  .filter(....)
  .map(....)
  .startWith([])

两种方法之间的区别很微妙,但非常重要。 mergeAll()的并发性为Infinity。那有什么意思? mergeAll()将获取所有内部可观察对象并订阅它们,并将它们的事件推送到包含的observable,而从不取消订阅。 switch()类似但是并发为1.它只会订阅最新的内部observable,同时处理前一个。

我不能确定这会回答你所有的问题,但我希望它至少让你开始朝着正确的方向前进! :)