Loading...
Velislav1985 avatar Velislav1985 1 Точки

Получаване на данни и манипулация чрез $.ajax & $.getJSON

Здравейте, искам да получа списък с всички акции влизащи в състава на S&P500, който да обработвам в последствие. Използвам следния код:

var SANDP500_stocks = "http://data.okfn.org/data/core/s-and-p-500-companies/r/constituents.json";
 function foo(SANDP500_stocks)
 {
     $.getJSON(SANDP500_stocks, function(result){
         var dtsp = [];
        $.each(result,function(i,field){$(dtsp).push(field);});return dtsp;
 });
 }
 var dtss = foo(SANDP500_stocks);
 console.log(dtss);

и не ми връща масива, а дава undefined. Ако променя функцията на each-a -->$(".quotes").appand(field["Name"] + ":" + field["Symbol"]); ги отпечатва на екрана. Същия резултат се получава и при използването на ajax в succsess  функцията. На мен тези стойности са ми нужни в масив, как мога да ги добия?

Тагове:
RoYaL avatar RoYaL Trainer 6849 Точки

Този подход е невъзможен. Ajax по природа е асинхронен (от там идва първото "A" в Ajax)). Ако асинхронно изчакваш да дойдат данните от сървъра, няма как да ги return-неш от функция. Return statement-а ще се изпълни преди success callback-а да мине изцяло.
 

Ще трябва да nest-ваш callbacks, за да си сигурен че това което изпълняваш, ще ползва данните от success-а. Другият варинат е да ползваш promises. Огледай се за библиотеки, които предоставят приятен API за промиси.

1
Velislav1985 avatar Velislav1985 1 Точки

Направих си промис и получих желания резултат!Ето и кода , който използвах ако потрябва на някого!

function promise(fn) {  
  var state = 'pending';
  var value;
  var deferred = null;

  function resolve(newValue) {
    if(newValue && typeof newValue.then === 'function') {
      newValue.then(resolve, reject);
      return;
    }
    state = 'resolved';
    value = newValue;

    if(deferred) {
      handle(deferred);
    }
  }

  function reject(reason) {
    state = 'rejected';
    value = reason;

    if(deferred) {
      handle(deferred);
    }
  }

  function handle(handler) {
    if(state === 'pending') {
      deferred = handler;
      return;
    }

    var handlerCallback;

    if(state === 'resolved') {
      handlerCallback = handler.onResolved;
    } else {
      handlerCallback = handler.onRejected;
    }

    if(!handlerCallback) {
      if(state === 'resolved') {
        handler.resolve(value);
      } else {
        handler.reject(value);
      }

      return;
    }

    var ret = handlerCallback(value);
    handler.resolve(ret);
  }

  this.then = function(onResolved, onRejected) {
    return new promise(function(resolve, reject) {
      handle({
        onResolved: onResolved,
        onRejected: onRejected,
        resolve: resolve,
        reject: reject
      });
    });
  };

  fn(resolve, reject);
}
SANDP500_stocks = "http://data.okfn.org/data/core/s-and-p-500-companies/r/constituents.json";
// var getJSON = function(url) {
  // return new promise(function(resolve, reject) {
    // var xhr = new XMLHttpRequest();
    // xhr.open('get', url, true);
    // xhr.responseType = 'json';
    // xhr.onload = function() {
      // var status = xhr.status;
      // if (status == 200) {
        // resolve(xhr.response);
      // } else {
        // reject(status);
      // }
    // };
    // xhr.send();
  // });
// };
 // quotes = getJSON(SANDP500_stocks).then(function(data) {
   // var arrau = new Array();
   // $.each(data,function(i,e){
      // arrau.push(e);
      // });
   // return arrau;
// }, function(status) {
  // return 'Something went wrong.';
// }); 
// quotes.then(function(res){
    // for(i=0;i<res.length;i++){$(".q").append(res[i]["Name"]);}});

var getJSON = function(url){
return new promise(function(resolve, reject) {
    var jsonFile = $.getJSON(url, function(result){return result}).fail(function(jqXHR, textStatus, errorThrown) { return textStatus; });
resolve(jsonFile);
});
}
sp500_all_companies = getJSON(SANDP500_stocks).then(function(data) {
   var array = new Array();
   $.each(data,function(i,e){
      array.push(e);
      });
   return array;
}, function(status) {
  return 'Something went wrong.';
}); 
sp500_all_companies.then(function(res){console.log(res);});

0
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.