Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/449.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
Javascript Lambda函数在异步请求结束之前不会返回_Javascript_Node.js_Aws Lambda_Node Request_Serverless Framework - Fatal编程技术网

Javascript Lambda函数在异步请求结束之前不会返回

Javascript Lambda函数在异步请求结束之前不会返回,javascript,node.js,aws-lambda,node-request,serverless-framework,Javascript,Node.js,Aws Lambda,Node Request,Serverless Framework,我想创建一个调用API(第三方)并立即返回的函数,但它正在等待API响应 以下是代码示例: var request = require('request'); // When I call functionOne it should trigger functionTwo and should end immediately, // but unfortunately, it is waiting for functionTwo to end module.exports.functionO

我想创建一个调用API(第三方)并立即返回的函数,但它正在等待API响应

以下是代码示例:

var request = require('request');

// When I call functionOne it should trigger functionTwo and should end immediately, 
// but unfortunately, it is waiting for functionTwo to end
module.exports.functionOne = (event, context, cb) => {
    const uri = 'https://xxxxxxxxx.execute-api.us-east-1.amazonaws.com/dev/functionTwo';
    request.post({ uri: uri });
    cb(null, "done functionOne");
};

module.exports.functionTwo = (event, context, cb) => {
    console.log("i'm functionTwo");
    setTimeout(function () {
        console.log("I'm functionTwo about to end");
        context.succeed("done functionTwo");
    }, 5000);
};
此外,如果我尝试调用
context.succeed()
而不是
cb()
,它甚至会阻止API调用和函数在不调用API的情况下立即返回

我还创建了一个关于的问题

其他信息:

  • 无服务器框架:v1.0.0-rc.2
  • 节点:v6.9.1
  • OS:赢10分

很抱歉,但是你不能实现你想要的,至少不能以这种方式

当您使用
request.post()
调用另一个函数时,必须提供回调,并且必须等待回调完成

您可以调用
request.abort()
,但这是一个黑客解决方案

module.exports.functionOne = (event, context, cb) => {
    const uri = 'https://xxxxxxxxx.execute-api.us-east-1.amazonaws.com/dev/functionTwo';
    const r = request.post({ uri: uri }, (error, response, body) => {
        cb(error, "done functionOne");
    });

    r.abort();
    cb(null, 'forced abort on functionOne');
};
为什么会这样?因为你不能马上中止。您需要等待几毫秒,才能在另一台服务器中接收到请求,但无法确切知道它发生的时间

如果您知道第二个Lambda将运行2分钟,则可以添加
setTimeout
函数以在5秒后中止请求,并避免
functionOne
在空闲状态下长时间运行。但同样,这是一个糟糕的解决方案

为什么不将
functionTwo
代码放在
functionOne
中,以避免启动第二个Lambda


另一个解决方法是从
functionOne
调用SNS主题,并将此主题配置为触发
functionTwo

functionTwo就在这里,举个例子,在实际情况中,有一个api是第三方的,我正在向该api发送post请求和一些数据,实际上它是OK,因此,我建议您针对SlackAPI创建另一个问题。如果它是另一个Lambda函数,您可以使用SNS,因为它只需几毫秒即可返回。如果Slack需要几秒钟才能完成,我不知道他们是否提供了另一种无需等待的方式来排队请求。否则,您可以中止请求以强制Lambda提前停止,但正如我所说的,您需要在Slack收到请求之前等待几分钟。很遗憾,中止请求并没有解决我的问题