Как написать цепочку обещаний с условием if в качестве первого утверждения? - PullRequest
0 голосов
/ 11 марта 2019

Обычно я делаю что-то вроде этого

  createQueue(sqs, queueName)
    .then(url => {
      return enqueue(sqs, url, message)
    })
    .then(messageId => {
      return res.status(HttpStatus.OK).send({ id: messageId })
    })
    .catch(err => {
      return handleErr(res, HttpStatus.INTERNAL_SERVER_ERROR, err)
    })

Но в этом случае у меня есть if проверка, существует ли URL-адрес, и если нет, я хочу позвонить createQueue, но в обоих случаях,Я хочу позвонить в остальную часть цепочки обещаний.

Каков наилучший способ сделать это?

// This doesn't work
if (!req.queueUrl) {
  return createQueue(sqs, queueName)
}
  .then(url => {
    const myUrl = req.queueUrl || url
    return enqueue(sqs, myUrl, message)
  })
  .then(messageId => {
    return res.status(HttpStatus.OK).send({ id: messageId })
  })
  .catch(err => {
    return handleErr(res, HttpStatus.INTERNAL_SERVER_ERROR, err)
  })

Примечание Вот как я решил это в прошлом

const promises = []
if (!req.queueUrl) {
  promises.push(createQueue(sqs, queueName))
}
Promise.all(promises)
  .then(url => {
    const myUrl = req.queueUrl || url
    return enqueue(sqs, myUrl, message)
  })
  .then(messageId => {
    return res.status(HttpStatus.OK).send({ id: messageId })
  })
  .catch(err => {
    return handleErr(res, HttpStatus.INTERNAL_SERVER_ERROR, err)
  })

Ответы [ 2 ]

2 голосов
/ 11 марта 2019

Цепочка фиктивного обещания, которое разрешает URL, где вы можете перевернуть его на createQueue, если вам нужно. Я все еще не уверен, что вы подразумеваете под queueUrl против url.

var startPromise = Promise.resolve(req.url);
if (!req.queueUrl) {
    startPromise = createQueue(sqs, queueName)
}
return startPromise.then(url => {
        return enqueue(sqs, url, message)
    })
    .then(messageId => {
        return res.status(HttpStatus.OK).send({
            id: messageId
        })
    })
    .catch(err => {
        return handleErr(res, HttpStatus.INTERNAL_SERVER_ERROR, err)
    })
1 голос
/ 11 марта 2019

Аннотация с функцией проверки и разрешения с помощью URL, если существует, или создания нового, если нет. Вернуть getQueueURL, если требуется.

function getQueueURL(queueURL) {
    if (!queueURL) {
        return createQueue(sqs, queueName);
    }

    return Promise.resolve(queueURL);
}

getQueueURL(req.queueUrl)
    .then(URL => enqueue(sqs, URL, message))
    .then(messageId => res.status(HttpStatus.OK).send({ id: messageId }))
    .catch(error => handleErr(res, HttpStatus.INTERNAL_SERVER_ERROR, error))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...