我一直在尝试向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);
我可能做错了,因为我得到了相同的结果。
目标是从响应中获取数据并将其发送到视图以进行迭代。
答案 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);
如果您有更多问题,请随时询问。