如何从async.js系列返回结果

adi*_*uro 2 javascript node.js async.js aws-lambda

我在async.js中看到的每个例子都是这样的:

var async = require(“async”);
async.series([
  function(callback) {
    setTimeout(function() {
      console.log(“Task 1”);
      callback(null, 1);
    }, 300);
  },
  function(callback) {
    setTimeout(function() {
      console.log(“Task 2”);
      callback(null, 2);
    }, 200);
  },
  function(callback) {
    setTimeout(function() {
      console.log(“Task 3“);
      callback(null, 3);
    }, 100);
  }
], function(error, results) {
  console.log(results);
});
Run Code Online (Sandbox Code Playgroud)

最后,他们总是只是console.log结果.但是,你如何实际返回结果.每次我尝试它都会回来,因为未定义.

我需要这样的东西:

var async = require('async');

var handler = function()
{
  async.series([
  function(callback) {
    setTimeout(function() {
      console.log('Task 1');
      callback(null, 1);
    }, 300);
  },
  function(callback) {
    setTimeout(function() {
      console.log('Task 2');
      callback(null, 2);
    }, 200);
  },
  function(callback) {
    setTimeout(function() {
      console.log('Task 3');
      callback(null, 3);
    }, 100);
  }
  ], function(error, results) {
    return results;
  });
}

var result = handler();
console.log(result);
Run Code Online (Sandbox Code Playgroud)

但是这不起作用,结果总是未定义的.

最后,我需要将其放在AWS Lambda上并使用context.succeed(results)调用返回结果.但是,我永远无法得到结果.我显然不了解这个过程,如果有人可以提供帮助,我将不胜感激,谢谢!

小智 6

您无法从异步调用返回结果.您可以做的是传递回调函数,当结果可用时,使用result作为参数调用该回调函数.

var async = require('async');

var handler = function(cb)
{
  async.series([
  function(callback) {
    setTimeout(function() {
      console.log('Task 1');
      callback(null, 1);
    }, 300);
  },
  function(callback) {
    setTimeout(function() {
      console.log('Task 2');
      callback(null, 2);
    }, 200);
  },
  function(callback) {
    setTimeout(function() {
      console.log('Task 3');
      callback(null, 3);
    }, 100);
  }
  ], function(error, results) {
    cb(error, results)
  });
}

handler(function(err, results) {
  if(!err) {
    console.log(results);
  }
})
Run Code Online (Sandbox Code Playgroud)