javascript - Требуются ли вложенные уловы в рамках обещаний?




mongoose promise (2)

Вы можете извлечь часть логики в отдельные функции и return внутренние обещания, чтобы всплыть любые исключения в цепочке обещаний:

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}
  });
}

Мы хотели бы уменьшить количество блоков улова в наших обещаниях. Если мы удалим вложенные уловы, возникнут ли исключения до родительского улова?

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));

Мы хотели бы удалить две вложенные защелки и оставить только защелку внизу. Это нормально?


Нет, они не будут. Они всплывают только в результате обещания результата, если вы объединяете свои обещания, для которых вам нужно return внутренние обещания, созданные обратными вызовами. В противном случае внешнее обещание не может ждать их и не будет знать, когда / как они решат (выполнят ли они или отклонят).

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));




bluebird