Как использовать 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- данные, это не существенно

Другие вопросы по тегам