我有一个简单的 lambda 函数,它异步进行 API 调用,然后返回数据。 99% 的情况下这都非常有效。当 API 花费的时间超过 lambda 配置的超时时间时,它会按预期给出错误。现在的问题是,当我对 lambda 函数进行任何后续调用时,它会永久给出超时错误。
"errorMessage": "2016-05-14T22:52:07.247Z {session} Task timed out after 3.00 seconds"
为了测试这种情况,我将 lambda 超时设置为 3 秒,并有办法在 lambda 中触发这两个函数。
JavaScript
function now() {
return response.tell('success');
}
function wait() {
setTimeout(function() { return response.tell('success'); }, 4000);
}
当我打电话给now
功能没有问题。当我打电话给wait
函数我收到超时错误,然后任何后续调用now
给我同样的错误。
这是预期的行为吗?我认为对 lambda 函数的任何后续调用都应该有效。我知道我总是可以增加配置超时,但我宁愿不这样做。
你应该看看你的函数句柄与特定的context.callbackWaitsForEmptyEventLoop
如果该布尔类型是false
, setTimeout 永远不会被触发,因为您可能之前已经回答/处理了 lambda 调用。
但如果值callbackWaitsForEmptyEventLoop
is true
- 那么你的代码就会做你正在寻找的事情。
另外 - 直接通过回调处理所有事情可能更容易,而不需要“手写”超时,更改配置超时等等......
E.g.
function doneFactory(cb) { // closure factory returning a callback function which knows about res (response)
return function(err, res) {
if (err) {
return cb(JSON.stringify(err));
}
return cb(null, res);
};
}
// you're going to call this Lambda function from your code
exports.handle = function(event, context, handleCallback) {
// allows for using callbacks as finish/error-handlers
context.callbackWaitsForEmptyEventLoop = false;
doSomeAsyncWork(event, context, doneFactory(handleCallback));
};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)