簡體   English   中英

如何在AWS Lambda函數中使用異步庫調用?

[英]How do I use async library calls in AWS Lambda functions?

我正在嘗試在AWS Lambda函數中使用由lob.com創建的nodejs-8.12庫。 代碼如下:

'use strict';


module.exports.handler = async (event, context) => {

  var imagine all the variable defined here

  console.log(front)
  console.log(r)

  // Create the address
  Lob.addresses.create({
    name: r.name,
    email: '',
    phone: '',
    address_line1: r.address1,
    address_line2: r.address2 || "",
    address_city: r.city,
    address_state: r.state,
    address_zip: r.zipcode,
    address_country: r.country
  }, function (err, address) {
    console.log(address)
    if (err) {
      console.log(err);
    } else {
      Lob.postcards.create({
        description: '',
        to: address.id,
        front: front,
        back: back,
      }, function (err, postcard) {
        var card = postcard
        if (err) {
          console.log(err);
        } else {
          console.log('The Lob API responded with this postcard object: ', postcard)

        }
      });
    }
  });


  return {
    statusCode: 200,
    body: JSON.stringify({
      message: 'Go Serverless v1.0! Your function executed successfully!',
      input: event,
    }),
  };

  // Use this code if you don't use the http event with the LAMBDA-PROXY integration
  // return { message: 'Go Serverless v1.0! Your function executed successfully!', event };
};

現在我運行了lamda函數,在運行上面始終執行的代碼之前,我可以看到日志記錄。 但是在lambda關閉之前執行的上述代碼中,沒有任何控制台日志記錄。

我現在意識到該函數沒有等待任何回調。 我讀過某個地方,您在調用異步函數時需要使用invoke ,但是我不確定在使用外部庫來管理請求本身時該怎么做。 有沒有辦法告訴函數等待所有這些完成?

我已經解決了您的問題,如下所示:

    'use strict';


    module.exports.handler = async (event, context, callback) => {

        //Create the address
        var promise = new Promise((resolve,reject)=> {
            Lob.addresses.create({
                name: r.name,
                email: '',
                phone: '',
                address_line1: r.address1,
                address_line2: r.address2 || "",
                address_city: r.city,
                address_state: r.state,
                address_zip: r.zipcode,
                address_country: r.country
            }, function (err, address) {

                if(err) return reject(err)

                return resolve(address)
            });
        })

        promise.then((data) => {

            Lob.postcards.create({
                description: '',
                to: data.id,
                front: front,
                back: back,
            }, function (err, postcard) {

                var message = 'Go Serverless v1.0! Your function executed successfully!'
                var code = 200

                if(err)
                {
                    message = err;
                    code = 500
                }

                return callback(null, {
                    statusCode: code,
                    body: JSON.stringify({
                        message: message,
                        input: event,
                    }),
                });

            });
        }).catch(reason => {

            return callback(null, {
                statusCode: 500,
                body: JSON.stringify({
                    message: reason,
                    input: event,
                }),
            });
        })
    };

我用promise來解決第一個調用,一旦解決了它,就調用了第二個方法。

我為您准備了一個示例(異步,回調和Promise): 在這里工作

只是您必須修改您的代碼!

希望對您有所幫助!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM