无法获得秘银的回复内容

时间:2015-11-22 21:06:31

标签: javascript mithril.js

我一直在尝试向NodeJS API发出请求。对于客户端,我使用的是Mithril框架。我用他们的第一个例子来发出请求并获取数据:

var Model = {
    getAll: function() {
        return m.request({method: "GET", url: "http://localhost:3000/store/all"});
    }
};

var Component = {
    controller: function() {
        var stores = Model.getAll();

        alert(stores); // The alert box shows exactly this: function (){return arguments.length&&(a=arguments[0]),a}
        alert(stores()); // Alert box: undefined
    },
    view: function(controller) {
        ...
    }
};

运行此操作后,我通过Chrome开发者工具注意到API正在正确响应以下内容:

[{"name":"Mike"},{"name":"Zeza"}]

我找不到将这些数据输入控制器的方法。他们提到使用此方法,var可能会保留undefined,直到请求完成,所以我按照下一个示例添加:

var stores = m.prop([]);

在模型之前并将请求更改为:

return m.request({method: "GET", url: "http://localhost:3000/store/all"}).then(stores);

我可能做错了,因为我得到了相同的结果。

目标是从响应中获取数据并将其发送到视图以进行迭代。

1 个答案:

答案 0 :(得分:2)

说明:

m.request也是一个函数,m.request.then(),这就是为什么"存储"价值是:

"function (){return arguments.length&&(a=arguments[0]),a}"

"存储()"是未定义的,因为你做了一个异步的ajax请求,所以你不能立即得到结果,需要稍等一下。如果你试图运行" stores()"经过一段时间的延迟,您的数据将会存在。这就是为什么你基本上需要承诺("然后"功能)。作为"然后(参数)"的参数传递的函数在响应准备就绪时执行。

工作样本:

您可以开始使用此示例,并实现您所需的功能:

var Model = {
    getAll: function() {
        return m.request({method: "GET", url: "http://www.w3schools.com/angular/customers.php"});
    }
};

var Component = {

    controller: function() {
        var records = Model.getAll();

        return {
            records: records
        }
    },

    view: function(ctrl) {
        return m("div", [
            ctrl.records().records.map(function(record) {
                return m("div", record.Name);
            })
        ]);
    }
};

m.mount(document.body, Component);

如果您有更多问题,请随时询问。