如何处理lambda nodejs中的异步调用

时间:2018-03-22 07:05:44

标签: node.js asynchronous aws-lambda uci

我正在使用lambda中的nodejs创建一个国际象棋引擎但是由于异步调用它每次都会在lambda上显示超时错误。这只是功能的一部分。它在本地nodejs控制台上工作正常但在lambda上没有。请有人建议,因为我是新手。

var chessjs = require('./chess');
var engine = require('uci');
var uciengine = new engine(process.env['LAMBDA_TASK_ROOT'] + '/stockfish');
var fs = require("fs");
var match;

function moveEngine() {
var curfen = "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1";
var depth = '20';

uciengine.runProcess().then(
        () => {
    console.log("Started.");
    return uciengine.uciCommand();
}
).then(
        () => {
    console.log("Is Ready?");
    return uciengine.isReadyCommand();
}
).then(
        () => {
    console.log("New game.");
    return uciengine.uciNewGameCommand();
}
).then(
        () => {
    console.log("Setting position.");
    return uciengine.positionCommand(curfen);
}
).then(
        () => {
    console.log('Starting position set');
    console.log('Starting analysis');
    return uciengine.depthLimitedGoCommand(depth, (info) => {
    });
}
).then((bestmove) => {
    console.log('Bestmove: ');
    console.log(bestmove);
    return uciengine.quitCommand();
}).then(() => {
    console.log('Stopped');
   response.sessionAttributes = {};
   context.succeed(response);
}).done();
}

  async call code
var chessjs = require('./chess');
var engine = require('uci');
var async= require('async');
var uciengine = new engine('/var/task/stockfish');
var fs = require("fs");
var match;

function moveEngine() {
   var curfen = "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1";
   var depth = '20';

async.auto({
runProcess: function(next, results) {
    uciengine.runProcess(next,results);
},
checkUiEngineReady:['runProcess',function(next,results) {
  uciengine.checkUiEngineReady(next,results);
}],
newGameCommand:['checkUiEngineReady',function(next,results) {
  uciengine.newGameCommand(next,results);
}],
position:['newGameCommand',function(next,results) {
  uciengine.positionCommand(curfen,next,results);
}],
godepth:['position',function(next,results) {
  uciengine.depthLimitedGoCommand(depth,next,results);
}]
}, function(err, response) {
if (err) {
    next(err);
} else {
    console.log(response);
    uciengine.quitCommand();
    context.succeed(response);
}
});
}
moveEngine();

异步调用给出了与之前相同的错误,我认为这可能是错误的。

1 个答案:

答案 0 :(得分:2)

您可以使用异步npm模块处理Lambda中的异步调用,该模块是一个实用程序模块,用于处理Nodej中的异步编程。

您可以使用npm install --save async安装async模块。

async.auto函数可用于管理上述调用。

以下是您可以管理代码的示例。

async.auto({
    runProcess: function(next, results) {
        runProcess(next,results);
    },
    checkUiEngineReady:['runProcess',function(next,results) {
      checkUiEngineReady(next,results);
    }],
    newGameCommand:['checkUiEngineReady',function(next,results) {
      newGameCommand(next,results);
    }]
}, function(err, response) {
    if (err) {
        next(err);
    } else {
        context.succeed(response);
    }
});

由于