Как использовать Mithril's m.request для загрузки данных с сервера?
Я хочу хранить блоки файла JSON в массиве. Вот мой текущий код в контроллере (Ctrl):
var ctrl = this;
var id = (location.href).replace(/.*\//g, ''); //use m.route() ?
ctrl.list = [];
m.request({method: "GET", url: "/data/"+id}).then(function(blocks){
blocks.map(function(block) {
ctrl.list.push(block);
});
});
console.log(ctrl.list); //Result : an empty array. Why ?
2 ответа
m.request
является асинхронной операцией: она должна сделать запрос к серверу, дождаться ответа сервера, загрузить содержимое, а затем дать ответ - вот почему он реализует then
: для обратного вызова, чтобы вы могли что-то делать с данными, когда они поступают.
Но твой console.log
происходит сразу после того, как вы сделаете запрос: ответ еще не готов. Все, что зависит от данных сервера, должно вызываться внутри then
функция обратного вызова.
controller: function() {
var response = m.prop(); return {
response: m.request({method:"GET",
url:"http://yourUrl", data:{date to send in Json format}}),
в представлении
m("ul" , ctrl.response().map(function(folder){
return [
m("li" , folder.name),
Папка в этом случае - это Json, который вы принимаете с сервера, предположим, что у вас есть это в ответе ["name": "Jhon"], с folder.name значением вашего li станет Jhon. Помните, что m.request хочет хотя бы метод и URL- данные, это не существенно