首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >变量未定义node.js

变量未定义node.js
EN

Stack Overflow用户
提问于 2015-05-19 20:55:25
回答 2查看 5.5K关注 0票数 3

我试图使用Node.js从API获得响应,我想清理API响应并使用结果。

因此,要访问第一个API,我有以下代码。

为了存储和使用结果,我相信我需要全局存储JSON输出。

但是,我想不出该怎么做。

例子-

代码语言:javascript
运行
复制
var request = require('request');

request({url: 'https://www.car2go.com/api/v2.1/vehicles?loc=wien&oauth_consumer_key=car2gowebsite&format=json', json: true}, function(err, res, json) {
if (err) {
    throw err;
}
car2go = json.placemarks;
for (i = 0; i < car2go.length; i++) {
    delete car2go[i].address;
    delete car2go[i].charging;
    delete car2go[i].exterior;
    delete car2go[i].interior;
    delete car2go[i].smartPhoneRequired;
    delete car2go[i].vin
    car2go[i].vendor = 'car2go';
    car2go[i].city = 'wien';
    car2go[i].carmake = 'Smart';
    car2go[i].carmodel = 'Fortwo';
}
console.log(car2go);
});

但是我知道这是因为我的变量是在函数中定义的。

我想访问函数之外的变量。

为了测试我是否能做到这一点,我把代码更改为-

代码语言:javascript
运行
复制
var request = require('request');

request({url: 'https://www.car2go.com/api/v2.1/vehicles?loc=wien&oauth_consumer_key=car2gowebsite&format=json', json: true}, function(err, res, json) {
if (err) {
    throw err;
}
car2go = json.placemarks;
for (i = 0; i < car2go.length; i++) {
    delete car2go[i].address;
    delete car2go[i].charging;
    delete car2go[i].exterior;
    delete car2go[i].interior;
    delete car2go[i].smartPhoneRequired;
    delete car2go[i].vin
    car2go[i].vendor = 'car2go';
    car2go[i].city = 'wien';
    car2go[i].carmake = 'Smart';
    car2go[i].carmodel = 'Fortwo';
}
});

console.log(car2go);

但如果我这么做我就会得到

代码语言:javascript
运行
复制
ReferenceError: car2go is not defined

我在上运行Nodev0.12.2 (10.10.3)。

诚然,我对node非常陌生,我更熟悉R、Python和PL。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-05-19 21:01:06

在回调函数之外无法获得对它的引用,因为console.log行在调用回调函数之前运行。必须将回调函数传递到请求API的原因是请求库在发出请求时需要调用该函数。同时,当应用程序等待回调函数启动时,您的应用程序将继续前进,并执行其他操作(例如运行console.log行)。

也就是说,有许多方法可以处理异步代码。我最喜欢的方法是承诺。我使用一个名为蓝鸟的库来处理承诺。

代码语言:javascript
运行
复制
var request = require('request');
var Promise = require('bluebird');
var requestP = Promise.promisify(request);

Promise.promisify(request)的调用返回一个新函数,它不接受回调函数,而是返回一个承诺

代码语言:javascript
运行
复制
requestP({ url: 'https://www.car2go.com/api/v2.1/vehicles?loc=wien&oauth_consumer_key=car2gowebsite&format=json', json: true })
  .spread(function(res, json) {
    var car2go = json.placemarks;
    for (i = 0; i < car2go.length; i++) {
      delete car2go[i].address;
      delete car2go[i].charging;
      delete car2go[i].exterior;
      delete car2go[i].interior;
      delete car2go[i].smartPhoneRequired;
      delete car2go[i].vin
      car2go[i].vendor = 'car2go';
      car2go[i].city = 'wien';
      car2go[i].carmake = 'Smart';
      car2go[i].carmodel = 'Fortwo';
    }
  })
  .then(function (car2go) {
    console.log(car2go);
  })
  .catch(function (err) {
    console.error(err);
  });

注意:.spread.then相同,除非解析值是数组(这将是因为传递给请求库的回调接受2个参数,蓝鸟将将其转换为承诺解析到的数组) .spread将将数组拆分回传递给.spread的函数中的多个参数。 Promise.resolve( 'hi‘,’那里‘).then(函数(结果){console.log(结果);//’hi‘,’存在‘};Promise.resolve('hi',’那里‘).spread(函数(str1,str2) { console.log(str1);// hi’console.log(str2);//‘hi’console.log(Str2);//‘hi’};

您将无法将该值返回到启动异步调用的相同上下文,但您至少可以编写在使用承诺时看起来有点同步的代码。

如果没有承诺,您将被迫从函数内部调用函数;)

票数 1
EN

Stack Overflow用户

发布于 2015-05-19 21:00:57

响应是异步的。这意味着回调函数在以后的某个时候会被调用,所以您的console.log(car2go)在回调之前就已经开始执行了。

唯一可以可靠地使用响应的地方是回调内部或回调函数中。你不能以你想要的方式使用它。在Javascript中使用异步响应需要以异步方式进行编程,这意味着只在异步回调中处理结果和使用结果。

这里应该是console.log()的位置:

代码语言:javascript
运行
复制
var request = require('request');

request({url: 'https://www.car2go.com/api/v2.1/vehicles?loc=wien&oauth_consumer_key=car2gowebsite&format=json', json: true}, function (err, res, json) {
    if (err) {
        throw err;
    }
    car2go = json.placemarks;
    for (i = 0; i < car2go.length; i++) {
        delete car2go[i].address;
        delete car2go[i].charging;
        delete car2go[i].exterior;
        delete car2go[i].interior;
        delete car2go[i].smartPhoneRequired;
        delete car2go[i].vin
        car2go[i].vendor = 'car2go';
        car2go[i].city = 'wien';
        car2go[i].carmake = 'Smart';
        car2go[i].carmodel = 'Fortwo';
    }
    // here is where the result is available
    console.log(car2go);
});
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30335977

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档