首页 > 解决方案 > 对于异步测试和钩子,确保调用了“done()”;

问题描述

我有以下有效的代码。

const AWS = require('aws-sdk');

export const handle = someFunction(
  event =>
    new Promise(resolve => {
        const sns = new AWS.SNS({ region: process.env.REGION });

        sns
           .publish()
           .promise()
           .then(data => {
              resolve({
                // some code
              });
           })
           .catch(er => {
              resolve({
               // some code
            });
           });
  })
);

但是一旦我sns.publish进入一个单独的函数,我就会收到以下错误。

错误:超过 2000 毫秒的超时。对于异步测试和钩子,确保调用了“done()”;如果返回 Promise,请确保它已解决。

const AWS = require('aws-sdk');

export const handle = someFunction(
  event =>
    new Promise(resolve => {
        publishSNS();
  })
);

const publishSNS => {
   const sns = new AWS.SNS({ region: process.env.REGION });

   sns
   .publish()
   .promise()
   .then(data => {
      resolve({
        // some code
      });
   })
   .catch(er => {
      resolve({
       // some code
    });
   });
};

标签: javascriptnode.jslambdapromisejestjs

解决方案


resolve不再在范围内,因此它将在那里抛出错误。没有理由将承诺包装成另一个承诺。

const publishSNS = () => {
   const sns = new AWS.SNS({ region: process.env.REGION });
   return sns.publish().promise();
};

然后您的其他功能可以处理它:

event => {
   return publishSNS()
          .then(data => /*handle success here */)
          .catch(err => /*handle error here */);
}
        

推荐阅读