Почему я могу ждать этот код, но не использовать .then? - PullRequest
5 голосов
/ 07 мая 2019

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);
        });
    });
}

SAMPLE 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;
    });
}

, очевидно, что проблема заключается в смешивании асинхронных / ожидающих сКлассическое обещание тогдашних способностей.Я бы ожидал SAMPLE C, чтобы работать, потому что getTime () возвращает обещание.Однако код просто завершается тихо, никогда не ударяя по второму маркеру.Я должен поставить первый маркер там, чтобы быть уверенным, что любой код вообще выполняется.Такое чувство, что я должен быть в состоянии смешать асинхронные / ожидающие и доступные для чтения, но я не должен здесь что-то рассматривать.

@ adrian, nope enter image description here

1 Ответ

3 голосов
/ 07 мая 2019

Вы не ожидаете и не возвращаете обещание от marketObject.getTime().then(), и это приведет к тому, что цепочка обещаний будет выполняться независимо, возврат основной функции и закрытие процесса.Помните ... then тоже возвращает обещание.

решение -

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

или

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

, так или иначе цепочка обещаний для основной функции такова, что независимо от того, что она выполняется, последовательно ожидает выполнения всех обещаний (или отклонить).

Я подозреваю, что пример B работает, потому что основной не асинхронный, и Lambda будет ждать завершения цикла обработки событий.т.е. он выполнит цепочку обещаний, даже если main вернется рано.

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

Если вы не используете обратный вызов в своем коде, AWS Lambda будет вызывать его неявно, а возвращаемое значение будет нулевым.Когда вызывается обратный вызов, AWS Lambda продолжает вызов функции Lambda до тех пор, пока цикл событий не станет пустым .

... и я подозреваю, что вы вернете Promise (как вы это делаетев примере C) тогда Lambda просто завершит процесс сразу же после его разрешения, что происходит потому, что вы не ожидаете / не возвращаете цепочку .then(), и, таким образом, созданная вами цепочка плавающих обещаний не будет выполняться.

...