gpt4 book ai didi

javascript - 变量未定义 node.js

转载 作者:搜寻专家 更新时间:2023-11-01 00:01:25 24 4
gpt4 key购买 nike

我正在尝试使用 Node.js 从 API 获取响应,我想清理 API 响应并使用结果。

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

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

但是,我不知道该怎么做。

示例 -

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);
});

这会打印出所需的结果,但我知道这是因为我的变量是在函数中定义的。

我想访问函数外的变量。

为了测试我是否可以这样做,我将代码更改为 -

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);

但是如果我这样做,我会得到

ReferenceError: car2go is not defined

我在 Mac OS Yosemite (10.10.3) 上运行 Node v0.12.2。

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

最佳答案

无法在回调函数之外获取对它的引用,因为 console.log 行在调用回调函数之前运行。您必须将回调函数传递到请求 API 的原因是请求库需要在完成请求后调用该函数。与此同时,您的应用会继续执行其他操作(例如运行 console.log 行),同时等待回调函数触发。

也就是说,有很多方法可以处理异步代码。我最喜欢的方式是 promise 。我使用一个名为 bluebird 的库用于处理 promise 。

var request = require('request');
var Promise = require('bluebird');
var requestP = Promise.promisify(request);

Promise.promisify(request) 的调用返回一个新函数,该函数不接受回调函数,而是返回一个 promise。 .

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);
});

Note: .spread is the same as .then except if the resolved value is an array (which it will be because the callback passed to the request library accepts 2 arguments, which bluebird will translate into an array that the promise resolves to) .spread will split up the array back into multiple arguments passed into the function you give to .spread.

Promise.resolve(['hi', 'there']).then(function (result) {
console.log(result); // "['hi', 'there']"
});

Promise.resolve(['hi', 'there']).spread(function (str1, str2) {
console.log(str1); // 'hi'
console.log(str2); // 'there'
});

您将无法将该值一直返回到您开始异步调用的同一上下文,但您至少可以编写在使用 promises 时看起来有点同步的代码。

如果没有 promises,你将被迫从函数内部调用函数,从函数内部调用函数 ;)

关于javascript - 变量未定义 node.js,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30335977/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com