首页 > 解决方案 > 无服务器上 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

无服务器.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

标签: node.jsaws-lambdaasync-awaitserverless-framework

解决方案


是的,就像评论说的那样,让你的假承诺的功能而不是 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()]);
...

推荐阅读