我在一个不一致的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()
}

10-06 04:16