我在不和谐的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”中的信息。
我该怎么办?
答案 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 );
});