>source

서버리스, 람다, Node.JS 10.15, 로컬로 호출

샘플 A) 작동 :

export async function main(event) {
    const marketName = marketIdToNameMap[event.marketId];
    const marketObject = marketDirectory[marketName];
    const marketClient = await marketObject.fetchClient();
    const marketTime = await marketObject.getTime(marketClient);
    console.log(marketTime);
}

샘플 B)이 작동합니다 :

export function main(event) {
    const marketName = marketIdToNameMap[event.marketId];
    const marketObject = marketDirectory[marketName];
    marketObject.fetchClient().then((marketClient)=>{
        marketObject.getTime(marketClient).then((result) => {
            console.log('<---------------> marker 1 <--------------->');
            console.log(result);
        });
    });
}

샘플 C) 그러나 그렇지 않습니다 :

export async function main(event) {
    const marketName = marketIdToNameMap[event.marketId];
    const marketObject = marketDirectory[marketName];
    const marketClient = await marketObject.fetchClient();
    console.log('<---------------> marker 1 <--------------->');
    marketObject.getTime(marketClient).then((result) => {
        console.log('<---------------> marker 22 <--------------->');
        console.log(result);
    });
}

getTime의 장은 모든 예에 대한 것입니다 :

function getTime(marketClient){
    return new Promise((resolve, reject) => {
        return marketClient.getTime((err, result) => {
            if (err) {
                reject(err);
            }
            resolve(result);
        });
    }).catch(err => {
        throw err;
    });
}

분명히, 약속 된 약속 가능 시간과 비동기식 /과 이음을 혼합하는 데 문제가있는 것 같습니다. getTime ()이 약속을 반환하기 때문에 샘플 C가 작동하는 것을예상합니다. 그러나 코드는 단순히 자동으로 완료되며 두 번째 마커에는 영향을 미치지 않습니다. 코드가 전혀 실행되지 않도록 첫 번째 마커를 배치해야합니다. async/await 및 thenables를 혼합 할 수 있어야한다고 생각하지만 여기에서 무언가를 고려해서는 안됩니다.

@ 아드리안, 아니

  • 답변 # 1

    당신은 marketObject.getTime().then() 에서 약속을 기다리거나 반환하지 않습니다 그러면 약속 체인이 독립적으로 실행되고 주 기능이 반환되고 프로세스가 종료됩니다. 기억해 .. then  약속도 돌려줍니다.

    해결책은

    await marketObject.getTime(marketClient).then(...
    
    

    또는

    return marketObject.getTime(marketClient).then(...
    
    

    어느 쪽이든 어떤 약속이든 일관되게 약속이 해결 (또는 거부) 될 때까지 기다리도록 주 함수에 약속을 묶는 방식이다.

    메인이 비동기가 아니고 Lambda가 이벤트 루프가 완료 될 때까지 기다릴 것이기 때문에 샘플 B가 작동한다고 생각합니다. 즉, 메인이 일찍 돌아 왔지만 약속 체인을 실행합니다.

    https://docs.aws.amazon.com/lambda/latest/dg/nodejs-prog-model-handler.html

    와이즈 비즈

    ... 그리고 샘플 C에서와 같이 약속을 반환하면 Lambda는 일단 프로세스가 해결되면 즉시 프로세스를 종료합니다 .

    If you don't use callback in your code, AWS Lambda will call it implicitly and the return value is null. When the callback is called, AWS Lambda continues the Lambda function invocation until the event loop is empty.

    를 기다리거나 반환하지 않기 때문입니다.  체인, 따라서 생성 한 부동 약속 체인은 실행되지 않습니다.

    .then()

관련 자료

  • 이전 r - 다른 데이터 프레임의 부분 문자열 일치를 기반으로 한 데이터 프레임에 열을 추가하려면 어떻게합니까?
  • 다음 javascript - angularjs의 다른 선택 목록에서 선택한 옵션을 비활성화하는 방법은 무엇입니까?