在节点

时间:2018-03-14 18:01:45

标签: node.js api express asynchronous

我在控制器中有这个功能

router.post('/', function(req, res, next) {
  if (req.user.isPremium == false) {
    // Free user - Single report
    let website = req.body.website0;
    let builtWithCall = `https://api.builtwith.com/free1/api.json?KEY=APIKEY&LOOKUP=${website}`;
    let pagespeedCall = `https://www.googleapis.com/pagespeedonline/v4/runPagespeed?url=https://${website}&strategy=mobile&key=APIKEY`;
    // curl 'https://www.googleapis.com/pagespeedonline/v4/runPagespeed?url=https://georgiancollege.ca&strategy=mobile&key=APIKEY'
    var calls = [];
    calls.push(function(callback) {
      // First call
      https.get(builtWithCall, function(resource) {
        resource.setEncoding('utf8');
        resource.on('data', function(data) {
          // console.log('BuiltWith received', data);
        });
      });
    });
    calls.push(function(callback) {
      // second call
      https.get(pagespeedCall, function(resource) {
        resource.setEncoding('utf8');
        resource.on('data', function(data) {
          // console.log(data);
        });
      });
    });
  } 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('/generated-report', {
      title: 'Report',
      data: {},
    });
  });
});

我正在尝试一次运行多个异步API调用。问题是,当我尝试像这样运行它们时

async.parallel(calls, function(err, results) {
  if(err){
    console.log(err);
  }
  console.log('async callback ', results);
  res.render('/generated-report', {
    title: 'Report',
    data: {},
  });
});

控制台不会记录任何内容。

当我通过此处进行控制台登录时

function(callback) {
  // second call
  https.get(pagespeedCall, function(resource) {
    resource.setEncoding('utf8');
    resource.on('data', function(data) {
      // console.log(data);
    });
  });
}

记录响应。 pageSpeed进入一个奇怪的循环并重复多次,但至少它可以工作。

现在我对async.parallel部分做错了什么?另外,function(callback) {中的回调是什么?

编辑:

这是匿名函数的新版本:

function(callback) {
  // second call
  var results;
  https.get(pagespeedCall, function(resource) {
    resource.setEncoding('utf8');
    resource.on('data', function(data) {
      results += data;
      // console.log(data);
    });
    resource.on('end', function(data) {
      callback(null, data);
    });
    resource.on('error', function(err) {
      callback(err);
    });
  });
}

1 个答案:

答案 0 :(得分:1)

您需要调用传入的callback。查看您的一个并行函数,您不是在调用callback()。我假设您的resource对象有一个end& error

function(callback) {
  // second call
  var results;
  https.get(pagespeedCall, 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);
    });
  });
}

async.parallel如何工作是所有被调用的函数必须依次调用传入的回调函数;在您的情况下是callback。 一旦并行中的每个函数都调用回调,那么将只调用最终函数,这是您定义为function(err, results) {...}的函数。

有一点需要注意,如果在callback调用中您为第一个参数传递非null,则会立即调用最终函数,以便在发生错误时处理该错误。