我在一个不一致的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 DOES在第一个console.log(在函数内部)包含所需的信息,但是在第二个console.log再次变为null [它什么也不显示]。
这意味着要么在两个console.log之间擦除了jsonFinal变量,要么是两个具有相同名称的不同变量:但是我无法从函数.getJson的“ jsonFinal”中获取信息。
我能怎么做 ?
最佳答案
这是因为$.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
(基于promise的样式)。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()
}