【问题标题】:Node.js - Asynchronous JSON QueryNode.js - 异步 JSON 查询
【发布时间】:2015-05-07 05:04:31
【问题描述】:

如果这是一个愚蠢的问题,我深表歉意,但我是 Javascript 新手,Node.js 真的让我很头疼,因为它是异步的。

我的目标是从 API 查询 JSON 对象并能够使用它。我试图寻找关于我应该做什么的问题和答案,但对我来说没有任何意义,所以我希望通过看到正确的代码来学习。

var request = require('request');

var url = 'url here';
var temp;
var done = false;

request(url, function (error, response, body) {
    if (!error) {
      temp = body;
      done = true;
      console.log(temp);
    } else {
        console.log(error);
    }
});

if (done){
  console.log(temp);

}

有人可以指导我通过正确的方法来重组我的代码吗?

【问题讨论】:

  • 见:stackoverflow.com/questions/17460556/…。尤其是答案底部的部分。
  • 每天会多次询问此问题的变体。这个问题的根源在于你需要真正了解什么是异步响应以及如何使用它。首先要了解的是,您的异步回调会在稍后的某个时间调用,但是在您的函数运行之后的代码行会在异步响应运行之前立即运行。因此,您只能在回调中使用异步响应。将所有需要使用响应的代码放在回调中。

标签: javascript json node.js asynchronous


【解决方案1】:

你正在用该行创建的函数

request(url, function (error, response, body) {

在收到响应之前不会执行。您的其余代码将继续运行。想想这样的流程:

var request = require('request');

var url = 'url here';
var temp;
var done = false;

request(url, XXX);

if (done){
  console.log(temp);

然后当收到响应时(可能是很久以后),函数XXX 被执行。

如你所见,done 在行时总是为假

if (done){

被执行。

【讨论】:

  • 我看到,当我在终端中运行它时,它会停止并最终给我一个错误。我该如何解决这个问题?
  • 如果你想对响应做任何事情,你必须在函数XXX中做。这会使您的 done 变量变得多余。
  • 在那个函数里面XXX 我建议你把debugger; 放在顶部,然后在控制台中玩。特别是,检查errorresponsebody 对象以熟悉它们所包含的内容。
  • 有没有办法保存对对象的响应并使用对象后记?
  • 尽量不要那样想......“之后”在那个功能中。尝试观看一些有关 Javascript 和异步函数式编程的 youtube 剪辑 - 它真的很漂亮。
猜你喜欢
  • 2017-12-01
  • 2020-08-18
  • 2017-04-08
  • 1970-01-01
  • 2018-07-31
  • 1970-01-01
  • 2015-01-07
  • 1970-01-01
  • 2018-05-02
相关资源
最近更新 更多