无法获取秘银中的响应内容

Cannot get response content in mithril

我一直在尝试向 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);

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

objective是从response中获取数据,发送给view进行迭代

解释:

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

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

"stores()"是未定义的,因为你做的是async ajax请求,所以你不能立即得到结果,需要稍等一下。如果您在延迟一段时间后尝试 运行 "stores()",您的数据将在那里。这就是为什么你基本上需要承诺("then" 功能)。作为 "then(param)" 的参数传递的函数在响应就绪时执行。

工作样本:

您可以开始玩这个示例,并实现您需要的东西:

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);

如果您有更多问题,请随时在这里提问。