Получаване на данни и манипулация чрез $.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 функцията. На мен тези стойности са ми нужни в масив, как мога да ги добия?
Направих си промис и получих желания резултат!Ето и кода , който използвах ако потрябва на някого!
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);});