Скрипт AWS SQS Node.js не ждет - PullRequest
0 голосов
/ 30 апреля 2019

Попытка отправить несколько сообщений (из лямбды AWS SQS, если это имеет значение), но она никогда не ждет обещаний.

function getEndpoint(settings){
    return new Promise(function(resolve, reject) { 
    // [...] more stuff here
}

Который затем вызывается в цикле:

exports.handler = async (event) => {
    var messages = [];
    event.Records.forEach(function(messageId, body) {
        //options object created from some stuff
        messages.push(getEndpoint(options).then(function(response){
            console.log("anything at all"); //NEVER LOGGED
        }));
    });
    await Promise.all(messages);
};

Но ожидание кажется пропущенным.Я не уверен, как я получаю Process exited before completing request с явным await.У меня есть аналогичные настройки асинхронного ожидания / обещания в других скриптах, которые работают, но я не могу определить, что я сделал неправильно с этим.

1 Ответ

3 голосов
/ 30 апреля 2019

Вы забыли что-то вернуть лямбде:

exports.handler = async (event) => {
    var messages = [];
    event.Records.forEach(function(messageId, body) {
        //options object created from some stuff
        messages.push(getEndpoint(options));
    });
    await Promise.all(messages);
    return 'OK'
};

это также должно работать:

exports.handler = (event) => { // async is not mandatory here
    var messages = [];
    event.Records.forEach(function(messageId, body) {
        //options object created from some stuff
        messages.push(getEndpoint(options));
    });
    return Promise.all(messages); // returning a promise
};

и вы можете использовать карту:

exports.handler = (event) => { // async is not mandatory here
    const messages = event.Records.map(function(messageId, body) {
        //options object created from some stuff
        return getEndpoint(options)
    });
    return Promise.all(messages); // returning a promise
};

Чтобы понять, почему это происходит, вы должны немного погрузиться в реализацию лямбды: она по существу будет ждать очистки стека функций, и, поскольку вы вообще ничего не возвращали, стек функций опустел сразу после того, как он был поставлен в очередь. все вещи - добавление простого возврата после вызова await делает стек fn НЕ пустым, что означает, что лямбда будет ждать его завершения.

Если вы запустите это на стандартном узле, ваша функция также вернется до того, как обещания будут завершены, НО процесс вашего узла НЕ завершится, пока стек не будет очищен. Вот где лямбда расходится со стоковым узлом.

...