通常我会做这样的事情
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)
})
答案 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))