如何将if条件作为第一条语句来编写承诺链?

时间:2019-03-11 19:20:58

标签: javascript node.js promise

通常我会做这样的事情

  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,但是在两种情况下,我都希望调用promise链的其余部分。

最好的方法是什么?

// 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 个答案:

答案 0 :(得分:2)

伪承诺的链,可解析该URL,您可以在需要时将其翻转到createQueue。我仍然不确定您的意思是queueUrl vs 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 :(得分:1)

具有用于检查和解析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))