2015-11-22 4 views
4

Я пытался сделать запрос к NodeJS API. Для клиента я использую Mithril framework. Я использовал свой первый пример, чтобы сделать запрос и получить данные:Не удается получить содержимое ответа в 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 Developer Tools, что API правильно реагирующая со следующим:

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

Я не могу найти способ получить эти данные в контроллере. Они отметили, что с помощью этого метода, то переменная может содержать undefined, пока запрос не будет завершен, поэтому я последовал следующий пример, добавив:

var stores = m.prop([]); 

Перед модели и изменение запроса:

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

Я мог бы сделать что-то неправильно, потому что получаю тот же результат.

Цель состоит в том, чтобы получить данные от ответа и отправить его на просмотр для повторения.

ответ

2

Пояснение:

m.request является функцией, m.request.then() тоже, поэтому значение "магазин" является:

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

"хранит()" не определен, потому что вы выполняете асинхронный запрос async, поэтому вы не можете сразу получить результат, нужно немного подождать. Если вы попытаетесь запустить «магазины()» после некоторой задержки, ваши данные будут там. Вот почему вам в основном нужны обещания (функция «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); 

Если у вас есть вопросы, не стесняйтесь задавать здесь.

+0

Обнаружил, что сохранение значения как 'this.records' в контроллере, без возврата также работает. Спасибо за ваш ответ. –

 Смежные вопросы

  • Нет связанных вопросов^_^