无法从JSON函数中获取数据

时间:2017-03-12 11:23:57

标签: javascript jquery json

我在不和谐的Javascript机器人中使用jQuery,在某些时候,我正在从网上获取数据以构建由检索到的数据组成的字符串。

这就是它的样子:

var jsonFinal = '';
var oembed_url = 'http://backend.deviantart.com/oembed?url=http%3A%2F%2Ffav.me%2Fd2enxz7&format=jsonp&callback=?';
$.getJSON(oembed_url, function(data) {
    jsonFinal = "("+data.author_name+")\n"+data.url;
        console.log(jsonFinal);
    });

console.log(jsonFinal):

正如您所看到的,应该包含最后所有数据的var“jsonFinal”被初始化为空白。 但实际上发生的事情是jsonFinal DOES在第一个console.log(函数内部)中包含所需信息,但在第二个console.log [它什么也没显示]时再次变为null。

这意味着在两个console.log之间擦除变量jsonFinal,或者这两个具有相同名称的不同变量:但是我无法从函数.getJson中获取“jsonFinal”中的信息。

我该怎么办?

3 个答案:

答案 0 :(得分:2)

这是因为$.getJSON是异步的。

console.log(jsonFinal):的第二个实例在第一个实例之前运行。

要获取“不在函数中”的信息,您需要从$.getJSON内部调用函数,或者在那里进行工作。

$.getJSON(oembed_url, function(data) {
  jsonFinal = "("+data.author_name+")\n"+data.url;
    fromInside(jsonFinal);
  });

function fromInside(data) {...}

或者您可以使用Promises,Generators,Async / Await等,具体取决于您使用的Node.js的版本,以及您是否使用babel

您可以使用node-fetch(基于承诺的风格)。

fetch(oembed_url)
.then(res => res.json())
.then(jsonFinal => {
  console.log(jsonFinal)
})

如果您使用的是Node.js v7,请在和弦​​标记后面解锁async/await

node --harmony-async-await app.js

然后你可以让程序“等待jsonFinal有一个值” - 但只能在一个函数内部。

async function getJSON(oembed_url) {
  let response = await fetch(oembed_url)
  let jsonFinal = await response.json()
}

答案 1 :(得分:1)

正如@Raphael所说;您可以使用以下方法实现它:

  $.ajax({
     url: url,
     dataType: 'json',
     async: false,
     data: mydata,
     success: function(data) {
    //stuff
     //...
   }
   });

答案 2 :(得分:1)

$。getJSON是异步方法...因此外部console.log在服务返回数据之前执行。

$。getJSON返回promise对象。你可以使用done的promise方法在服务调用后做一些动作。

$.getJSON( oembed_url, function(data) {
    jsonFinal = "("+data.author_name+")\n"+data.url;
        console.log();
    }).done(function() {
     console.log( jsonFinal );
   });