javascript和api调用:如何获取从api调用返回的值?

时间:2019-10-06 02:26:18

标签: javascript jquery

例如,如果我定义这样的代码

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

2 个答案:

答案 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;之前运行。

此外,当您以后想要使用数据时,可能必须等待数据可用。这就是诺言所要做的。