我正在使用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,
});
});
网站变量来自视图。
这很酷,但我需要获取属性,以生成用户友好的报告。我尝试将parsing
转换为JSON,但它只是将意外值undefined
抛出为0' ...这意味着异步调用将其返回为未定义。
我该如何解决这个问题?
答案 0 :(得分:3)
好吧,你似乎在做一些奇怪的事情:你定义一个results
var,它是undefined
,然后你做results += data
。这会导致results
为undefined {<whichever-data-is>}
。这就是为什么你在页面中有'未定义'的原因。不要使用+=
,只需使用=
,或初始化results
:var results = ''
;
我并没有完全通过分配或将data
附加到另一个变量而不仅仅是返回它而得到你要做的事情,因为结果只在它定义的函数中被分配一次。