【问题标题】:Cannot get data out of JSON function无法从 JSON 函数中获取数据
【发布时间】:2017-08-02 11:24:58
【问题描述】:

我在一个不和谐的 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 在第一个 console.log(函数内部)确实包含所需的信息,但在第二个 console.log 再次变为 null [它什么都不显示]。

这意味着变量 jsonFinal 在两个 console.log 之间被擦除,或者这是两个具有相同名称的不同变量:但我无法从函数 .getJson 中获取“jsonFinal”的信息。

我该怎么办?

【问题讨论】:

标签: javascript jquery json


【解决方案1】:

这是因为$.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()
}

【讨论】:

  • 这看起来很有希望,我要试试。但由于这是一个使用 NodeJS 而不是浏览器的不和谐机器人,因此需要一些时间才能完成的同步方法根本不是问题。有没有办法让程序“等待 jsonFinal 有值”?
  • 请注意,“从 jQuery 1.5 开始,$.getJSON() 返回的 [the] jQuery XHR 对象实现了Promise 接口,为它提供了Promise 的所有属性、方法和行为。 "
  • @Rackover,已更新。 @Whymarrh,当然。但是,如果他只使用jQuery 作为$.getJSON() 方法(很可能),他可能会放弃对node-fetch 之类的jQuery 依赖。
【解决方案2】:

正如@Raphael 提到的那样;您可以通过以下方式实现它:

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

【讨论】:

  • 使用同步 XHR 调用是一个very bad idea有时它会锁定浏览器,让最终用户感到沮丧。
【解决方案3】:

$.getJSON 是异步方法...所以外部 console.log 在服务返回数据之前被执行。

$.getJSON 返回承诺对象。您可以在服务调用后使用 done 的 promise 方法执行一些操作。

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

【讨论】:

    猜你喜欢
    • 2013-11-18
    • 1970-01-01
    • 2014-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-21
    • 1970-01-01
    相关资源
    最近更新 更多