@nickerlan

Сгорают ли промисы после res.end?

Есть у меня миркосервис.

Хочу часть логики сделать асинхронной:

async (req,res)=>{
   var data = await action1(data); //синхронный вызов
   action2(data) // асинхронный вызов
   //.then() // нужен ли then?
   res.end(data)
}


Хочу чтобы данные посылались в ответ на запрос, а уже после их отправки мог быть завершен асинхронный вызов.

В связи с этим вопрос - если я оставлю просто вызов без await - он пройдет? Не будет ли программа завершена раньше, чем запрос будет осуществлен? Повлияет ли на что-то наличие/отсутствие .then()?
  • Вопрос задан
  • 142 просмотра
Пригласить эксперта
Ответы на вопрос 3
Robur
@Robur
Знаю больше чем это необходимо
Промисы не бонусы, не сгорают.
Они или когда-нибудь зарезолвятся или никогда.
если я оставлю просто вызов без await - он пройдет?

не знаю что значит "пройдет". Функция вызовется, а что произойдет - зависит от этой функции.
Не будет ли программа завершена раньше, чем запрос будет осуществлен?

Если у вас что-то работает то не будет. обработка запроса - это просто вызов функции, то же самое как что-то сделать в setTimeout()
Повлияет ли на что-то наличие/отсутствие .then()

Повлияет на то как оно все будет работать. а какой будет результат зависит от того что вы напишете.

Вам бы про все это взять и почитать нормальную доку и разобраться.
Ответ написан
Комментировать
Зависит от реализации вашего менеджера микросервисов. Взять, например, Google Cloud Functions – сервис ожидает успешное выполнение Promise или ошибку, а после может делать что угодно. Может оставить конкретно ваш экземпляр Node работать (так и будет, скорее всего), а может и завершить процесс сразу. Так что корректнее в этом случае сначала ответить клиенту, а потом дождаться завершения асинхронных операций:

async (req, res) => {
  const data = await action1(data)
  res.end(data)
  await action2(data)
}
Ответ написан
@nickerlan Автор вопроса
Выяснил: после отправки запроса - лямбда завершается.
По крайней мере в случае с Zeit Now, а это надстройка над AWS Lambdas.

На мой вопрос - что с этим делать, они ответили "You are looking for queue support. You would put that job in queue to be consumed by another resource. We will release this in the future and I will contact you when its live."

Похоже, придется использовать костыль - всю асинхронную часть оборачивать, потому что это в примере, функция всего одна. На деле - их много, и они по разным модулям сидят.

const __async=(promise)=>{
    if (!process.promises || !Array.isArray(process.promises)) process.promises=[];
    process.promises.push(promise)
}
const __withasync= (handler)=>{
    return async (req,res)=>{
        var result = await handler(req,res);
        if (process.promises && Array.isArray(process.promises)) await Promise.all(process.promises);
        return result;
    }
}

module.exports={__async,__withasync}


Если есть решение лучше - дайте знать
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы