在使用background:true时,如何使用MithrilJS中m.request的值?

时间:2015-02-06 02:36:56

标签: javascript ajax mithril.js

我在项目中使用m.request,因为我有一个可能长时间运行的请求,所以我想用background:true运行它。但是,似乎值永远不会设置为生成的m.prop

我根据此Stack Overflow answer制作了一个jsFiddle示例:http://jsfiddle.net/u5wuyokz/9/

我预计会发生的第二次调用应该在ctrl.test.data()中有响应值,但它似乎仍然有undefined。在代码中的Point A处,它会记录正确的值。但是,在Point B,它会记录false, undefined,然后记录true, undefined

我不确定我做错了什么,或者这是否是预期的行为。

来自jsFiddle的代码:

var requestWithFeedback = function(args) {
  var completed = m.prop(false)
  var complete = function(value) {
    completed(true)
    return value
  }
  args.background = true
  return {
    data: m.request(args).then(complete, complete).then(function(value) {
        //Point A
        console.log(value);
        m.redraw()
        return value
    }),
    ready: completed
  }
};

var mod = {
        controller : function() {
            this.test = requestWithFeedback({
                method : "POST",
                url : "/echo/json/",
                serialize: serialize, 
                config: asFormUrlEncoded,
                data : {
                    json : "{\"name\" : \"testing\"}"
                }
            });
        },
        view : function(ctrl) {
            //Point B
            console.log(ctrl.test.ready(), ctrl.test.data());
            return m("div", ctrl.test.ready() ? 'loaded' : 'loading');
        }
    };

2 个答案:

答案 0 :(得分:2)

编辑:问题是在分配数据之前调用了m.redraw。相反,您可以为m.prop创建data,并在完成后让ajax请求分配该值。 requestWithFeedback将如下所示:

var requestWithFeedback = function(args) {
  var data = m.prop()
  args.background = true
  m.request(args).then(data).then(function() { m.redraw() })

  return {
    data: data,
    ready: function() {return !!data()}
  }
};

以下是使用此代码修改的小提琴版本:http://jsfiddle.net/u5wuyokz/11/

答案 1 :(得分:1)

使用background: true时,Mithril的components branchany other system执行同一个' tick'作为视图,控制器中的m.request在各自视图调用时将无法解析。

因此,如果您使用initialValue,则始终使用m.request background: true属性recommended。规范示例是,当您请求条目列表时,初始值为[]

var projectsModule = {
  controller(){
    this.projects = m.request( {
      background   : true,
      initialValue : [],
      url          : '/projects.json'
    } );
  },
  view( ctrl ){
    return m( 'ul', ctrl.projects.map( 
      project => m( 'li', project.name )
    ) )
  }
}

这解决了当他们期望能够以通用方式使用m.request返回值时视图中断的实际问题,但是没有解决示例中更复杂的情况,其中{需要{1}}标记来表示加载'}州。我有一个通用API,它使用模型getter函数和一个可选的初始值。它具有readynextthenhasResolvedisPendingget方法:这使得视图在方式上更加灵活查询异步模型的状态。 set表示该方法是否已解决,hasResolved返回将使用当前请求解析的承诺,或者next为假时解析下一个请求的承诺。