我使用的是Parse,异步函数不像预期的那样有问题。我在AWS上的Node.js 8.10上运行这个。下面是我的函数的一个(非常简化的)版本:
Parse.Cloud.job("updateSubscriptions", async (req, res) => {
try {
winston.info("Updating subscriptions...");
var Subscription = Parse.Object.extend("Subscription");
var query = new Parse.Query(Subscription);
await query.find().then(
function () {
winston.debug("Got subscriptions.");
},
function(error) {
winston.error("Error querying subscriptions.");
}
);
winston.debug("Wrapping up.");
} catch (e) {
winston.error("Uh oh.");
}
});我想要的(也是期望的)是得到输出“更新订阅.获得订阅。结束”。
实际上我看到的是“更新订阅.”仅此而已。似乎该函数实际上并不在等待异步调用,而且/或Lambda正在提前终止该进程。
有人知道我在这里做错了什么吗?
发布于 2018-08-20 00:15:09
我已经解释了为什么它不是一个bug,它是由设计和故意的。因此,您可以在httpRequest超时的情况下运行更长时间。
如果您查看代码这里,您将看到handleCloudJob()函数的长度很长,从而将作业执行与请求生命周期隔离开来。这是故意的,而不是错误。
现在,让我们看看它在lambda中是如何工作的:
现在想象一下我们没有那么做:
如果不是6,而是发出回复,我们在工作中“等待”,就像你说的
会发生的情况是:
现在,在您的lambda环境中发生了什么:
这就是人们所期望的行为。
还能更好吗?也许,但这需要一个完全不同的作业执行环境。基本上是等待在后台执行很长时间的功能的消息的工作人员(所以不是前端lambdas)。
在lambdas的常见问题,它是说,默认超时时间为3s。和可以扩展到最大300 s。因此,默认情况下,lambda不适合运行作业。
虽然我理解你的挫折感,这对“你”没有任何意义,但这都是故意的。
即使我们在解析服务器上交换了实现,它也不适合lambda运行作业。
https://stackoverflow.com/questions/51832572
复制相似问题