如何依次执行四个异步功能?

Mar*_*lov 0 javascript asynchronous amazon-web-services node.js amazon-dynamodb

我正在使用包含四个异步函数的这段代码。我需要他们严格执行。
我该如何执行它们将按照示例中给出的顺序执行?
我的用例在Lambda中,并且可以访问异步。

    function scanProducts() {
      dynamoClient.scan(productParams, function (err, data) {

      });
    }

    function scanCoupons() {
      dynamoClient.scan(couponsParams, function (err, data) {

      });
    }

    function scanRetailers() {
      dynamoClient.scan(retailerParams, function (err, data) {

      });
    }

    function sendEmail(ses) {
      var email = {
        "Source": "test@gmail.com",
        "Template": "test-template",
        "Destination": {
          "ToAddresses": ["test@gmail.com"]
        },
        "TemplateData": `{}`
      }

      ses.sendTemplatedEmail(email);
    }
Run Code Online (Sandbox Code Playgroud)

Cer*_*nce 5

我会将其转换dynamoClient.scan为基于Promise的函数,然后对其进行await每次调用,例如:

const dynamoClientScanProm = (params) => new Promise((resolve, reject) => {
  dynamoClient.scan(params, function (err, data) {
    if (err) reject(err);
    else resolve(data);
  });
});

// ...
// in an async function:

try {
  await dynamoClientScanProm(productParams);
  await dynamoClientScanProm(couponsParams);
  await dynamoClientScanProm(retailerParams);

  // promisify/await this too, if it's asynchronous
  ses.sendTemplatedEmail(email);
} catch(e) {
  // handle errors
}
Run Code Online (Sandbox Code Playgroud)

尚不清楚您是否需要使用调用结果,但是如果您确实需要结果并且不只需要等待Promise解析,则在awaiting 时将其分配给变量,例如

const productResults = await dynamoClientScanProm(productParams);
Run Code Online (Sandbox Code Playgroud)

也就是说,如果的其他调用未使用结果dynamoClientScanProm,则并行(使用Promise.all)而不是串行运行所有调用会更有意义,这样可以更快地完成整个过程。