我正在使用 https
和 async
同时进行两个调用。作为返回,我得到两个对象,然后我将它们放入一个数组中。这就是我打电话的方式:
if (req.user.isPremium == false) {
// Free user - Single report
let website = req.body.website0;
let builtWithCall = `https://api.builtwith.com/free1/api.json?KEY=key&LOOKUP=${website}`;
let pagespeedCall = `https://www.googleapis.com/pagespeedonline/v4/runPagespeed?url=https://${website}&strategy=mobile&key=key`;
// curl 'https://www.googleapis.com/pagespeedonline/v4/runPagespeed?url=https://georgiancollege.ca&strategy=mobile&key=AIzaSyDqOAEXV6WrNioBeOA76GOWzDSX2FvS--0'
var calls = [];
calls.push(function(callback) {
// first call
var results;
https.get(builtWithCall, function(resource) {
resource.setEncoding('utf8');
resource.on('data', function(data) {
results += data;
// console.log(data);
});
resource.on('end', function() {
callback(null, results);
});
resource.on('error', function(err) {
callback(err);
});
});
});
calls.push(function(callback) {
// second call
var results;
https.get(pagespeedCall, function(resource) {
resource.setEncoding('utf8');
resource.on('data', function(data) {
results += data;
});
resource.on('end', function() {
// var j = JSON.parse(results);
// console.log(j.kind);
callback(null, results);
});
resource.on('error', function(err) {
callback(err);
});
});
});
} else {
// Premium user - comparison report
let websites = [];
}
async.parallel(calls, function(err, results) {
if (err) {
console.log(err);
}
// console.log('async callback ', results);
res.render('reports/report', {
title: 'Report',
data: results.filter(x => x != null),
user: req.user,
});
});
网站变量来自 View 。
这一切都很酷,但我需要获取属性,以生成用户友好的报告。我尝试将其解析
为 JSON,但它只是抛出“意外值 undefined
0”...这意味着异步调用将其返回为未定义。
我该如何解决这个问题?
最佳答案
好吧,你似乎在做一些奇怪的事情:你定义了一个 results
var,即 undefined
, 然后你做 results += data
.这导致 results
成为undefined {<whichever-data-is>}
.这就是为什么您在页面中有“未定义”的原因。不要使用 +=
, 只需使用 =
, 或初始化 results
: var results = ''
;
通过分配或附加 data
,我不完全明白您要做什么到另一个变量而不是仅仅返回它,但是,因为结果只在它定义的函数中分配一次。
关于javascript - API 返回数据,但在 undefined object 中。这是怎么回事?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49390058/