ExtJS захватывают результат JSON

Не бить мертвую лошадь, но вы можете ускорить это, сделав два изменения, которые теперь стали для меня второй натурой. Первый - использовать map! вместо map, чтобы избежать создания копии разделенного массива, а второй - избегать использования символа для синтаксиса proc (например, &:split, который добавляет дополнительную операцию, которую можно избежать с более подробным синтаксисом).

Ниже приведен контрольный показатель:

require 'benchmark'

s = "one thing, two things, three things, four things"
result = ""

Benchmark.bmbm do |b|
    b.report("strip/split (map/to_proc): ") { 1_000_000.times { result = s.split(",").map(&:strip) } }
    b.report("strip/split (map): ") { 1_000_000.times { result = s.split(",").map { |e| e.strip } } }
    b.report("strip/split (map!/to_proc): ") { 1_000_000.times { result = s.split(",").map!(&:strip) } }
    b.report("strip/split (map!): ") { 1_000_000.times { result = s.split(",").map! { |e| e.strip } } }
    b.report("regex: ") { 1_000_000.times { result = s.split(/\s*,\s*/) } }
end

Результаты:

                                   user     system      total        real
strip/split (map/to_proc):     5.230000   0.010000   5.240000 (  5.283079)
strip/split (map):             4.660000   0.010000   4.670000 (  4.716920)
strip/split (map!/to_proc):    4.440000   0.020000   4.460000 (  4.492943)
strip/split (map!):            4.320000   0.010000   4.330000 (  4.365386)
regex:                         7.190000   0.060000   7.250000 (  7.322932)

Не забудьте прочитать числа относительно друг друга, а не относительно показателей, представленных в других ответах.

17
задан Gergo Erdosi 18 May 2014 в 12:23
поделиться

3 ответа

Простой подход:

Ext.Ajax.request({
  loadMask: true,
  url: 'myfile.php',
  params: {id: "1"},
  success: function(resp) {
    // resp is the XmlHttpRequest object
    var options = Ext.decode(resp.responseText).options;

    Ext.each(options, function(op) {
      alert(op.message);
    }
  }
});

Или вы могли бы сделать это более экстренно, используя Store:

var messages = new Ext.data.JsonStore({
  url: 'myfile.php',
  root: 'options',
  fields: [
    {name: 'text', mapping: 'message'}
  ],
  listeners: {
    load: messagesLoaded
  }
});
messages.load({params: {id: "1"}});

// and when loaded, you can take advantage of
// all the possibilities provided by Store
function messagesLoaded(messages) {
  messages.each(function(msg){
    alert(msg.get("text"));
  });
}

Еще один пример для ответа на последний комментарий:

var messages = [{title: "1"},{title: "2"},{title: "3"}];

var titles = msg;
Ext.each(messages, function(msg){
  titles.push(msg.title);
});
alert(titles.join(", "));

Хотя я бы предпочитаю делать это с помощью Array.map (который не предоставляется Ext):

var text = messages.map(function(msg){
  return msg.title;
}).join(", ");
alert(text);
35
ответ дан 30 November 2019 в 11:08
поделиться

Используйте свойства success и failure :

Ext.Ajax.request({
    loadMask: true,
    url: 'myfile.php',
    params: {id: "1"},
    success: function(response, callOptions) {
       // Use the response
    },
    failure: function(response, callOptions) {
       // Use the response
    }
});

Дополнительные сведения см. В документации Ext API

6
ответ дан 30 November 2019 в 11:08
поделиться

, если вы уверены, что ваш ввод правильный (остерегайтесь атак xss), вы можете использовать функцию eval () чтобы сделать ваш объект javascript из вашего результата json, к которому затем можно получить доступ с помощью вашей команды:

var mymessages = jsonData.options;

Но опять же, Ext делает это хорошо для вас, как указал Рене с помощью функции Ext.decode

1
ответ дан 30 November 2019 в 11:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: