例如,如果我定义这样的代码
var price;
$.getJSON('https://api.coindesk.com/v1/bpi/historical/close.json?start=2013-09-01&end=2013-09-05', function( data ) {
price = data.bpi;
});
然后我可以从console
那里获取价格;
但是,如果我定义这样的代码
var price;
$.getJSON('https://api.coindesk.com/v1/bpi/historical/close.json?start=2013-09-01&end=2013-09-05', function( data ) {
price = data.bpi;
});
console.log(price);
仍然可以从控制台访问price
,但是console.log
返回undefine
。
我的问题是我如何才能从price
返回的data.api
,所以我以后可以使用数据进行进一步的计算,例如
var x = Object.keys(price);
var y = Object.values(price);
// some plot using x, y, and some calculations
答案 0 :(得分:0)
get方法是异步的,这意味着代码执行将继续执行get块之后的语句,而无需等待它。一旦get调用完成,将执行get块中的代码并返回结果。因此,控制台日志语句甚至在调用完成之前就已执行且未定义。
如果要处理返回的数据,则必须在get()函数的回调方法中完成所有计算。
$.getJSON('https://api.coindesk.com/v1/bpi/historical/close.json?start=2013-09-01&end=2013-09-05', function( data ) {
price = data.bpi;
var x = Object.keys(price);
var y = Object.values(price);
});
答案 1 :(得分:0)
我认为javascript promises是您要找的东西。
const promise = new Promise((resolve, reject) => {
const url = 'https://api.coindesk.com/v1/bpi/historical/close.json?start=2013-09-01&end=2013-09-05';
$.getJSON(url, data => {
resolve(data);
});
});
//and then later
promise.then(data => {
console.log(data.bpi);
});
<!DOCTYPE html>
<html>
<head>
<script src="https://code.jquery.com/jquery-3.1.0.js"></script>
</head>
<body>
</body>
</html>
price = data.bpi;
无法立即运行,但是您的代码继续执行,因此console.log(price);
在price = data.bpi;
之前运行。
此外,当您以后想要使用数据时,可能必须等待数据可用。这就是诺言所要做的。