Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 如何处理lambda nodejs中的异步调用_Node.js_Asynchronous_Aws Lambda_Uci - Fatal编程技术网

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

Node.js 如何处理lambda nodejs中的异步调用,node.js,asynchronous,aws-lambda,uci,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'] + '/s

我正在使用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();

async调用像以前一样给出了相同的错误,我认为这可能是错误的

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

您可以使用npm安装--save 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);
    }
});

谢谢

我已经在我的模块中安装了async,但第一次使用它时,我只包含了var async=require('async');在我的代码中,它开始工作,但现在不工作了,我不知道现在出了什么问题。我的国际象棋引擎路径正确吗?您能告诉我错误,并在Lambda控制台中设置超时时间吗?响应:{“errorMessage”:“2018-03-22T10:41:08.435Z d48b4ae1-2dbc-11e8-9822-f7bc88c773ee任务在300.05秒后超时”}请求ID:“d48b4ae1-2dbc-11e8-9822-f7bc88c773ee”功能日志:开始请求ID:d48b4ae1-2dbc-11e8-9822-f7bc88c773ee版本:$最新结束请求ID:d48b4ae1-2dbc-11e8-9822-f7bc88c773ee报告请求ID:d48b4ae1-2dbc-11e8-9822-f7bc88c773ee持续时间:300047.20毫秒计费持续时间:300000毫秒内存大小:128 MB最大使用内存:36 MB 2018-03-22T10:41:08.435Zd48b4ae1-2dbc-11e8-9822-f7bc88c773ee任务在300.05秒后超时。从上述日志来看,您的代码执行时间似乎超过300秒(即5分钟)。您是否正在使用任何耗时超过5分钟的长时间运行任务,并且是否可以从AWS lambda控制台增加lambda函数内存大小?不,实际上,当我在本地运行该任务时,它最多需要10秒。您是否需要调用
engine.done()
来关闭事件循环上的持久化内容?或者,也许您应该设置
context.callbackaitsforeptyeventloop=false
(但如果可能,除非您理解其含义),尝试了该设置,但无效。我的异步函数语法正确吗?这令人困惑。谢谢你的回复。