我在一个不和谐的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
函数中获取信息。
我该怎么办?
3条答案
按热度按时间flseospp1#
这是因为
$.getJSON
是异步的。console.log(jsonFinal):
的第二个示例在第一个示例之前运行。要“从函数中”获取信息,您需要从
$.getJSON
内部调用函数,或者在$.getJSON
内部执行操作。或者你可以使用Promises,Generators,Async/Await等,这取决于你使用的Node.js的版本,以及你是否使用
babel
。您可以使用
node-fetch
(用于基于承诺的样式)。如果您使用的是Node.js
v7
,请在和声标志后面解锁async/await
。node --harmony-async-await app.js
然后,您实际上可以让程序“等待jsonFinal有一个值”--但只能在函数内部。
gpfsuwkq2#
正如“拉斐尔”提到的;您可以使用以下命令来实现:
bz4sfanl3#
$.getJSON是异步方法......因此外部console.log在服务返回数据之前执行。
$.getJSON返回promise对象,服务调用后可以使用promise的done方法做一些动作。