node.js - 无服务器上 Promise.race() 的问题/错误(从以前的调用加载缓存)
问题描述
该应用程序在 NodeJs 中运行,我们正在使用 Promise.race() 来使主 Promise 超时,如代码所示(这里的“mainPromise”是用于测试的通用 Promise)。
const promiseTimeout = new Promise((resolve, _) => {
setTimeout(() => {
resolve('promise Timeout');
}, 20000);
});
const mainPromise = new Promise((resolve, _) => {
setTimeout(() => {
resolve('Main promise finished');
}, 21000);
});
export const triggerVerifySls = async (event: any, context: any) => {
context.callbackWaitsForEmptyEventLoop = false;
const triggerStatus = await Promise.race([mainPromise, promiseTimeout]);
const response = {
statusCode: 200,
body: JSON.stringify(triggerStatus),
};
return response;
};
当我们部署和调用该函数时,它第一次工作,但在其他调用中,Promise.race 返回数组中第一个 Promise 的响应。
使用 Promise.race([mainPromise, promiseTimeout]) 输出
$ Serverless reponse: promise Timeout
$ Serverless reponse: Main promise finished
$ Serverless reponse: Main promise finished
$ Serverless reponse: Main promise finished
使用 Promise.race([promiseTimeout, mainPromise]) 输出
$ Serverless reponse: promise Timeout
$ Serverless reponse: promise Timeout
$ Serverless reponse: promise Timeout
$ Serverless reponse: promise Timeout
似乎该函数已缓存响应,因为它在第一次调用后没有等待 20 秒: screenshot
- 该函数是否缓存响应?
- 该函数是否支持 Promise.race?
无服务器.YML
frameworkVersion: '2'
provider:
name: aws
runtime: nodejs14.x
memorySize: 2052
timeout: 30
region: us-east-1
functions:
triggerVerifySls:
handler: src/serverless/triggerVerifySls.triggerVerifySls
events:
- http:
path: triggerVerifySls
method: post
解决方案
是的,就像评论说的那样,让你的假承诺的功能而不是 const 承诺:
const promiseTimeout = () => new Promise((resolve, _) => {
setTimeout(() => {
resolve('promise Timeout');
}, 20000);
});
const mainPromise = () => new Promise((resolve, _) => {
setTimeout(() => {
resolve('Main promise finished');
}, 21000);
});
然后像这样调用它:
const triggerStatus = await Promise.race([mainPromise(), promiseTimeout()]);
...
推荐阅读
- angular - 如何保存从用户那里获得的路由参数的值并将其保存以供其他组件使用?
- c++ - 如何在地图c ++中查找和打印对键
- python - 如何使用python将文本提取到数据框或csv中的每一行
- routes - 如何从列表插件中获取参数到 extbase 中的 showplugin 并避免在 url 中显示它?
- libgit2 - 如何使用 libgit2 将对象直接写入包文件?
- javascript - 如何在 React 中更改导入组件的 CSS 属性
- google-cloud-sdk - 在 Ubuntu 上安装 Google Cloud SDK 时出错,如何解决?
- r - 识别向量的第一次出现,其中 15 个值中有 12 个为 1
- sql-server - 无法使用变量执行 SQL Server 存储过程(找不到存储过程)
- c++ - 为 QDoubleSpinBox 的多个实例创建一个公共插槽