javascript - example - promesas ajax jquery
¿Se requieren capturas anidadas dentro de las promesas? (2)
Nos gustaría reducir el número de bloques de captura dentro de nuestras promesas. Si eliminamos las capturas anidadas, ¿aumentarán las excepciones a la captura padre?
temporaryUserModel.findOne({email: req.body.email})
.then(tempUser => {
if (tempUser) {
temporaryUserModel.findOneAndUpdate({_id: tempUser.toJSON()._id}, user)
.then((doc) => {
return res.status(200).json({
status: ''Success'',
data: {url: planOpted.chargifySignupUrl}
});
})
.catch(err => error(err, res));
} else {
temporaryUserModel(user).save()
.then((doc) => {
return res.status(200).json({
status: ''Success'',
data: {url: planOpted.chargifySignupUrl}
});
})
.catch(err => error(err, res));
}
})
.catch(err => error(err, res));
Nos gustaría eliminar las dos capturas anidadas y mantener solo la captura en la parte inferior. ¿Esta bien?
No, no lo harán. Solo se suman a la promesa de resultados si encadena sus promesas, para lo cual necesita return
las promesas internas creadas por las devoluciones de llamada. De lo contrario, la promesa externa no puede esperarlos y no sabrá cuándo y cómo se resuelven (si se cumplen o rechazan).
temporaryUserModel.findOne({email: req.body.email}).then(tempUser => {
if (tempUser) {
return temporaryUserModel.findOneAndUpdate({_id: tempUser.toJSON()._id}, user);
// ^^^^^^
} else {
return temporaryUserModel(user).save();
// ^^^^^^
}
}).then((doc) => {
// no need to duplicate this code when you chain anyway
return res.status(200).json({
status: ''Success'',
data: {url: planOpted.chargifySignupUrl}
});
}).catch(err => error(err, res));
Puede extraer parte de la lógica en funciones separadas y return
las promesas internas para hacer saltar las excepciones a la cadena de promesa:
temporaryUserModel.findOne({email: req.body.email})
.then(updateTempUser)
.then(formatResponse)
.catch(err => error(err, res));
function updateTempUser(tempUser) {
if (tempUser) {
return temporaryUserModel.findOneAndUpdate({
_id: tempUser.toJSON()._id
}, user);
} else {
return temporaryUserModel(user).save()
}
}
function formatResponse(doc) {
return res.status(200).json({
status: ''Success'',
data: {url: planOpted.chargifySignupUrl}
});
}