Lambda node.js에서 예측할 수없는 비동기 코드 실행

원숭이

Lambda에서 비동기 코드를 사용하는 방법을 이해할 수 없습니다. 결과는 당혹 스럽습니다. 두 가지 기능을 만들어 보겠습니다.

const sendToFirehoseAsync = async (param) => {
    console.log(param);
    const promise = new Promise(function(resolve, reject) {

        var params = {
            DeliveryStreamName: 'TestStream', 
            Records: [{ Data: 'test data' }]
        };
        console.log('params', params);

        firehose.putRecordBatch(params, function (err, data) {
            if (err) console.log(err, err.stack); // an error occurred
            else console.log('Firehose Successful',  data);           //         successful response
        });
    });
    return promise;
}

const sendToFirehoseSync = (param) => {
    console.log(param);

    var params = {
        DeliveryStreamName: 'TestStream', 
        Records: [{ Data: 'test data' }]
    };
    console.log('params', params);

    firehose.putRecordBatch(params, function (err, data) {
        if (err) console.log(err, err.stack); // an error occurred
        else console.log('Firehose Successful',  data);           //         successful response
    });  
}

이제 그들을 실행하고 무슨 일이 일어나는지 봅시다!

비동기 기능 실행-잘 작동합니다.

exports.handler = async (event) => {
    let res = await sendToFirehoseAsync('test1');
    return res;
}

    2020-11-05T20:19:16.146+13:00   START RequestId: e4c505ea-1717-4998-ad0d-a42434f0a0c1 Version: $LATEST
    2020-11-05T20:19:16.148+13:00   2020-11-05T07:19:16.147Z e4c505ea-1717-4998-ad0d-a42434f0a0c1 INFO test1
    2020-11-05T20:19:16.149+13:00   2020-11-05T07:19:16.149Z e4c505ea-1717-4998-ad0d-a42434f0a0c1 INFO params { DeliveryStreamName: 'TestStream', Records: [ { Data: 'test data' } ] }
    2020-11-05T07:19:16.245Z    e4c505ea-1717-4998-ad0d-a42434f0a0c1    INFO    Firehose Successful {
        FailedPutCount: 0,
        Encrypted: false,
        ....

그러나 await를 사용하여 함수를 두 번 호출하면 (아래 참조) 정확히 동일한 응답을받습니다 (예 : 테스트 2에 대한 console.log가 표시되지 않음 등). 두 번째 호출이 발생하지 않는 것과 같습니다. 무슨 일입니까? await첫 번째 함수가 해결 될 때까지 실행을 중단 한 다음 계속할 것이라고 가정했습니다 .

let res = await sendToFirehoseAsync('test1');
res = await sendToFirehoseAsync('test2');
return res;

이제 몇 번 더 연속해서 실행 해 보겠습니다.

console.log('async call 1');
await sendToFirehoseAsync('test1');

console.log('async call 2');
await sendToFirehoseAsync('test2');

console.log('sync call 1');
let resp1 = await sendToFirehoseSync('1');

console.log('sync call 2');
let resp2 = await sendToFirehoseSync('2');

console.log('after sync calls');

2020-11-05T20:35:28.465+13:00   2020-11-05T07:35:28.464Z 5a9e551f-ecc6-4f18-8af4-a11b1b29d835 INFO async call 1
2020-11-05T20:35:28.465+13:00   2020-11-05T07:35:28.465Z 5a9e551f-ecc6-4f18-8af4-a11b1b29d835 INFO test1
2020-11-05T20:35:28.467+13:00   2020-11-05T07:35:28.467Z 5a9e551f-ecc6-4f18-8af4-a11b1b29d835 INFO params { DeliveryStreamName: 'TestStream', Records: [ { Data: 'test data' } ] }
2020-11-05T20:35:28.577+13:00   2020-11-05T07:35:28.577Z 5a9e551f-ecc6-4f18-8af4-a11b1b29d835 INFO Firehose Successful { FailedPutCount: 0, Encrypted: false, RequestResponses: [ { RecordId: '4v+6H3T3koBggYYvdu/U6fg4h0C8m4taPVYznfYT4fIAWmm9XKu4/9F9jEgjdZFE02IsNgYs0/ORGzz1l2udEzCJUN1dRR1YCHSi/jiLI/DHGpTkoyN89VUG0jGzNlAERgUNCIwxXlCYww/l2HSGjK8++f+qmRj7sTCY/J4/QlV2sqhcXSlJjKhkK+A+Ib7w2+WwdZ5gliF64fSP9qkQSpeSutOh68o6' } ] }
2020-11-05T20:35:28.580+13:00   END RequestId: 5a9e551f-ecc6-4f18-8af4-a11b1b29d835

다시 한 번 결과가 하나만 반환됩니다. 나머지는 없어?!

그리고 두 번의 비동기 호출로 동일한 결과를 얻은 다음 두 번의 동기화 호출과 좋은 측정을 위해 하나 더 호출합니다.

console.log('async call 1');
await sendToFirehoseAsync('test1');

console.log('async call 2');
await sendToFirehoseAsync('test2');

console.log('sync call 1');
let resp1 = await sendToFirehoseSync('1');

console.log('sync call 2');
let resp2 = await sendToFirehoseSync('2');

console.log('after sync calls');


const promise = new Promise(function(resolve, reject) {

    var params = {
        DeliveryStreamName: 'TestStream', 
        Records: [{ Data: 'test data 2' }]
    };
    console.log('params', params);

    firehose.putRecordBatch(params, function (err, data) {
        if (err) console.log(err, err.stack); // an error occurred
        else console.log('Firehose Successful',  data);           //         successful response
    });
});

return promise;  

그러나 ... 마지막 예제를 다시 실행하고 2 개의 비동기 호출을 주석 처리하면 다른 결과가 나타납니다.

console.log('sync call 1');
let resp1 = await sendToFirehoseSync('1');

console.log('sync call 2');
let resp2 = await sendToFirehoseSync('2');

console.log('after sync calls');


const promise = new Promise(function(resolve, reject) {

    var params = {
        DeliveryStreamName: 'TestStream', 
        Records: [{ Data: 'test data 2' }]
    };
    console.log('params', params);

    firehose.putRecordBatch(params, function (err, data) {
        if (err) console.log(err, err.stack); // an error occurred
        else console.log('Firehose Successful',  data);           //         successful response
    });
});

return promise;

2020-11-05T20:42:08.713+13:00
2020-11-05T07:42:08.713Z    333feae9-f306-409c-89c8-1707e0547ba3    INFO    sync call 1
2020-11-05T07:42:08.713Z 333feae9-f306-409c-89c8-1707e0547ba3 INFO sync call 1
2020-11-05T20:42:08.713+13:00   2020-11-05T07:42:08.713Z 333feae9-f306-409c-89c8-1707e0547ba3 INFO 1
2020-11-05T20:42:08.715+13:00   2020-11-05T07:42:08.715Z 333feae9-f306-409c-89c8-1707e0547ba3 INFO params { DeliveryStreamName: 'TestStream', Records: [ { Data: 'test data' } ] }
2020-11-05T20:42:08.760+13:00   2020-11-05T07:42:08.760Z 333feae9-f306-409c-89c8-1707e0547ba3 INFO after sync calls
2020-11-05T20:42:08.760+13:00   2020-11-05T07:42:08.760Z 333feae9-f306-409c-89c8-1707e0547ba3 INFO params { DeliveryStreamName: 'TestStream', Records: [ { Data: 'test data 2' } ] }
2020-11-05T20:42:08.808+13:00   2020-11-05T07:42:08.807Z 333feae9-f306-409c-89c8-1707e0547ba3 INFO Firehose Successful { FailedPutCount: 0, Encrypted: false, RequestResponses: [ { RecordId: 'iWeCDK6kukfkLfh/1mg791g3sIVpDC1hNNokJuTGFJJaLBNd1TvvCiWHV4z2iiWS3hOvu9OmKVnUofCPbr5uewKPAQBdiCJp9iVIzTakcL5bb4CkyOZKxzLX4NOxTP94Z0j64KgssWo10z7jEhDoevF8NTMZR+tUlhHmYtEGcQq2YViwwXhpYX8MP4yvS5xSRo+sjJXEcyoty+Pvt1UFWGelEKIygtnO' } ] }
2020-11-05T20:42:08.865+13:00   2020-11-05T07:42:08.865Z 333feae9-f306-409c-89c8-1707e0547ba3 INFO Firehose Successful { FailedPutCount: 0, Encrypted: false, RequestResponses: [ { RecordId: 's5loZTT8d4J0fhSjnJli0LzOzljnvgvC99AvdSeqkj/j9xp5RnjstL5UxQXm5t+uyEbSSe21XZxwaUU/D7XVsCzpJ6F5nlnzsOZBLd6vyaF3bc2lSUo2DM2u9dGetJPMahC1b0rO+GXod91sC9XumS8QWIVePcww2DH0IM46RuoLEVVR3/kgcnvhIm/UU67JuvZkFTCAP/jss0VwVUY2vmzfdvw4mJT4' } ] }
2020-11-05T20:42:08.867+13:00   END RequestId: 333feae9-f306-409c-89c8-1707e0547ba3

내가 볼 수있는 유일한 패턴은 수익입니다. 비동기 함수에는 반환이 있습니다. 이로 인해 함수뿐만 아니라 전체 람다가 반환 될 수 있습니까? 이 (안타깝게도) 긴 실험이 도움이되고 누군가 이것이 어떻게 작동하는지 알려줄 수 있기를 바랍니다. 건배.

** 해결 및 거부 추가 **

console.log('before');
await sendToFirehosePromise('thing');
console.log('after');

....

async function sendToFirehosePromise(record) {
    var params = {
        DeliveryStreamName: 'TestStream', 
        Records: [{ Data: 'test data' }]
    };
    
    const promise =  new Promise((resolve, reject) => {
        firehose.putRecordBatch(params, (err, data) => {
            if (err) return reject(err);
            return resolve(data);
        });
    });       
    return promise;
}
404

람다에서 순수한 비동기 호출을 가능한 많이 줄여 보겠습니다.

function f(p) {
    console.log(p);
    return new Promise(res => res('result ' + p));
}

exports.handler = async () => {
    let res = await f(1);
    console.log(res);
    res = await f(2);
    console.log(res);
    res = await f(3);
    console.log(res);
}

인쇄물:

2020-11-05T10:40:25.298Z    bd564d91-480f-4dcd-8134-1481fa59a946    INFO    1
2020-11-05T10:40:25.298Z    bd564d91-480f-4dcd-8134-1481fa59a946    INFO    result 1
2020-11-05T10:40:25.298Z    bd564d91-480f-4dcd-8134-1481fa59a946    INFO    2
2020-11-05T10:40:25.298Z    bd564d91-480f-4dcd-8134-1481fa59a946    INFO    result 2
2020-11-05T10:40:25.298Z    bd564d91-480f-4dcd-8134-1481fa59a946    INFO    3
2020-11-05T10:40:25.299Z    bd564d91-480f-4dcd-8134-1481fa59a946    INFO    result 3

이제 당신의 것을 비교하십시오. 첫째,이 서명이 잘못되었습니다 (또는 최소한 불필요합니다) const sendToFirehoseAsync = async (param). 비동기는 무언가를 기다리는 경우에만 필요합니다. 기다리지 않고 기다리지 않는 경우 비동기로 표시 할 필요가 없습니다. 비동기 함수는 promise를 반환하는 모든 것을 기다릴 수 있습니다. 함수가 promise를 반환하고 아무것도 기다리지 않으면 비동기로 표시하지 마십시오.

이제 불필요하게 약속과 비동기를 혼합하는 부분입니다.

async function sendToFirehosePromise(record) {
    var params = {
        DeliveryStreamName: 'TestStream', 
        Records: [{ Data: 'test data' }]
    };
    
    const promise =  new Promise((resolve, reject) => {
        firehose.putRecordBatch(params, (err, data) => {
            if (err) return reject(err);
            return resolve(data);
        });
    });       
    return promise;
}

async를 사용하려는 경우 async를 사용하십시오. 모든 AWS SDK 호출은 AWS.Request. 이 유형에는 promise()메소드 가 포함되어 있습니다 . 실제 약속 표기법을 사용하는 대신 해당 약속을 기다릴 수 있습니다.

async function sendToFirehosePromise(record) {
    var params = {
        DeliveryStreamName: 'TestStream', 
        Records: [{ Data: 'test data' }]
    };
    return await firehose.putRecordBatch(params).promise();
}

이는 SDK를 사용자 지정 약속으로 묶는 대신 async / await를 적절하게 사용하는 것입니다. 이제 핸들러에서 원하는만큼 함수를 기다릴 수 있으며 항상 작동합니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

이 코드를 Node.js에서 어떻게 동 기적으로 실행할 수 있습니까?

분류에서Dev

Node JS에서 코드를 실행하는 동안 명령으로 파일에 액세스 할 수 없습니다.

분류에서Dev

node.js에서 두 개의 코드를 동시에 실행할 수 있습니까?

분류에서Dev

Node.js에서 미들웨어 기능을 비동기 적으로 실행할 수 있습니까?

분류에서Dev

Node.js-SyntaxError : 6.10.2 노드에서 실행하는 동안 예기치 않은 토큰 가져 오기

분류에서Dev

주기적으로 비동기 작업을 자동으로 수행하기 위해 Node.js에서 별도의 스레드에 해당하는 것을 실행할 수 있습니까?

분류에서Dev

C #에서 JS 코드 실행 예외 : 예상되는 함수

분류에서Dev

영원히 실행되는 Node.JS 비동기 함수 결과 없음

분류에서Dev

AWS Lambda Node.js는 비동기 HTTP 요청이 완료된 후 this.emit을 실행합니다.

분류에서Dev

Node js, 루프 후 코드 동기화를 실행하는 방법

분류에서Dev

NodeJS-비동기 함수 내부의 코드가 순서없이 실행 됨

분류에서Dev

내 서비스의 메서드가 호출되기 전에 일부 코드를 어떻게 비동기 적으로 실행할 수 있습니까?

분류에서Dev

Node.js : 클라이언트 측 실행 코드 가져 오기

분류에서Dev

IMX.6에서 동일한 opencl 코드를 실행할 수없는 이유는 무엇입니까?

분류에서Dev

예상대로 실행되지 않는 비동기 대기 코드

분류에서Dev

Node.js에서 동기 및 비동기 함수 배열을 실행하는 방법

분류에서Dev

Java API에서 Tensorflow 예측을 실행할 수 없습니다.

분류에서Dev

AWS Lambda에서 다수의 동시 기능 실행 (예 : 브로드 캐스트 푸시 알림)

분류에서Dev

AWS-AWS Lambda에서 코드를 실행하는 동안 현재 프로젝트 경로 가져 오기

분류에서Dev

Atom 편집기에서 Javascript 코드를 실행할 수 없습니다.

분류에서Dev

Python 표시 :-TypeError : 코드를 실행하는 동안 Python에서 'int'개체를 호출 할 수 없습니다.

분류에서Dev

Cloud Firestore 트리거에서 비동기 코드를 실행하는 방법

분류에서Dev

C에서 예측할 수없는 동적 크기 배열

분류에서Dev

양식과 함께 코드를 동기화하기 전에 비동기 코드를 실행하는 방법

분류에서Dev

Dart에서 동기식으로 비동기 코드 실행

분류에서Dev

AWS에서 Node Lambda 및 C # Lambda를 동시에 실행

분류에서Dev

Node.js 비동기 모듈 폭포-동적으로 함수로드 및 실행

분류에서Dev

app.post는 node.js에서 여러 번 실행할 수 없습니다.

분류에서Dev

알림 API에서 app.js를 실행할 수 없습니다. | 소시 오 보드 | Node.JS

Related 관련 기사

  1. 1

    이 코드를 Node.js에서 어떻게 동 기적으로 실행할 수 있습니까?

  2. 2

    Node JS에서 코드를 실행하는 동안 명령으로 파일에 액세스 할 수 없습니다.

  3. 3

    node.js에서 두 개의 코드를 동시에 실행할 수 있습니까?

  4. 4

    Node.js에서 미들웨어 기능을 비동기 적으로 실행할 수 있습니까?

  5. 5

    Node.js-SyntaxError : 6.10.2 노드에서 실행하는 동안 예기치 않은 토큰 가져 오기

  6. 6

    주기적으로 비동기 작업을 자동으로 수행하기 위해 Node.js에서 별도의 스레드에 해당하는 것을 실행할 수 있습니까?

  7. 7

    C #에서 JS 코드 실행 예외 : 예상되는 함수

  8. 8

    영원히 실행되는 Node.JS 비동기 함수 결과 없음

  9. 9

    AWS Lambda Node.js는 비동기 HTTP 요청이 완료된 후 this.emit을 실행합니다.

  10. 10

    Node js, 루프 후 코드 동기화를 실행하는 방법

  11. 11

    NodeJS-비동기 함수 내부의 코드가 순서없이 실행 됨

  12. 12

    내 서비스의 메서드가 호출되기 전에 일부 코드를 어떻게 비동기 적으로 실행할 수 있습니까?

  13. 13

    Node.js : 클라이언트 측 실행 코드 가져 오기

  14. 14

    IMX.6에서 동일한 opencl 코드를 실행할 수없는 이유는 무엇입니까?

  15. 15

    예상대로 실행되지 않는 비동기 대기 코드

  16. 16

    Node.js에서 동기 및 비동기 함수 배열을 실행하는 방법

  17. 17

    Java API에서 Tensorflow 예측을 실행할 수 없습니다.

  18. 18

    AWS Lambda에서 다수의 동시 기능 실행 (예 : 브로드 캐스트 푸시 알림)

  19. 19

    AWS-AWS Lambda에서 코드를 실행하는 동안 현재 프로젝트 경로 가져 오기

  20. 20

    Atom 편집기에서 Javascript 코드를 실행할 수 없습니다.

  21. 21

    Python 표시 :-TypeError : 코드를 실행하는 동안 Python에서 'int'개체를 호출 할 수 없습니다.

  22. 22

    Cloud Firestore 트리거에서 비동기 코드를 실행하는 방법

  23. 23

    C에서 예측할 수없는 동적 크기 배열

  24. 24

    양식과 함께 코드를 동기화하기 전에 비동기 코드를 실행하는 방법

  25. 25

    Dart에서 동기식으로 비동기 코드 실행

  26. 26

    AWS에서 Node Lambda 및 C # Lambda를 동시에 실행

  27. 27

    Node.js 비동기 모듈 폭포-동적으로 함수로드 및 실행

  28. 28

    app.post는 node.js에서 여러 번 실행할 수 없습니다.

  29. 29

    알림 API에서 app.js를 실행할 수 없습니다. | 소시 오 보드 | Node.JS

뜨겁다태그

보관