javascript 无法从JSON函数中获取数据

ymdaylpp  于 2023-01-29  发布在  Java
关注(0)|答案(3)|浏览(223)

我在一个不和谐的Javascript机器人中使用jQuery,在某个时候,我从Web上获取数据,以构建由检索到的数据组成的字符串。
这是它的样子:

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在第一个console.log(在函数内部)包含所需的信息,但在第二个console.log再次变为空(不显示任何内容)。
这意味着变量jsonFinal在两个console.log之间被擦除,或者这两个变量是具有相同名称的不同变量:但是我无法从jsonFinal函数中获取信息。
我该怎么办?

flseospp

flseospp1#

这是因为$.getJSON是异步的。
console.log(jsonFinal):的第二个示例在第一个示例之前运行。
要“从函数中”获取信息,您需要从$.getJSON内部调用函数,或者在$.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()
}
gpfsuwkq

gpfsuwkq2#

正如“拉斐尔”提到的;您可以使用以下命令来实现:

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

bz4sfanl3#

$.getJSON是异步方法......因此外部console.log在服务返回数据之前执行。
$.getJSON返回promise对象,服务调用后可以使用promise的done方法做一些动作。

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

相关问题