Sails JS два запроса, второй сбой, удалить первый

#javascript #asynchronous #sails.js

#javascript #асинхронный #sails.js

Вопрос:

Я не совсем уверен, как описать мою проблему, поэтому название этого вопроса немного сбивает с толку. Ситуация такова, что если внутри контроллера Sails SJS есть действие, которое должно сохранять данные с помощью двух разных запросов. Мой вопрос в том, есть ли хороший и элегантный способ удалить первую запись, если второй запрос завершается неудачно (потому что данные двух запросов связаны)?

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

Бруно

РЕДАКТИРОВАТЬ Вот мой текущий код:

 async.auto([
        user: function(callback) {
          User.create({
            mail: data.mail,
            password: data.password,
            device_id: data.device_id,
            own_number: data.own_number
          }).exec(callback);
        },
        contact: function(callback) {
          Contact.create({
            number: data.own_number,
            number_id: util.hash(data.own_number),
            soundlogo: null
          }).exec(callback);
        }
      ],
      function(error, results) {
        // check for error
        if(error){
          sails.log(error);

          // Check whether one was successful and remove it

          return res.json({errorMsg: error});
        }
  

Комментарии:

1. Не могли бы вы вставить свой текущий код, пожалуйста?

2. Согласно вставленному вами коду, user и contact являются независимыми, и ни один из параметров ответа из user не используется contact . Таким образом, вы можете использовать async.auto и создавать запись в contact первую очередь и при успешном выполнении этой записи создавать запись в user таблице.

Ответ №1:

вы можете использовать простой асинхронный ряд ()

 async.series([
    user: function(scb) {
      User.create({
        mail: data.mail,
        password: data.password,
        device_id: data.device_id,
        own_number: data.own_number
      }).exec(function(err, user){

         if(user){
            scb(null, user);
         }
         else{
            return res.json({errorMsg: "failed to create user!"});
            // scb("failed to create user!");
         }

      });
    },

    contact: function(scb) {
      Contact.create({
        number: data.own_number,
        number_id: util.hash(data.own_number),
        soundlogo: null
      })
      .exec(function(err, contact){

         if(user){
            scb(null, contact);
         }
         else{
            return res.json({errorMsg: "failed to create contact!"});
            // scb("failed to create contact!");
         }

      });
    }
],

function(error, results) {
    // check for error
    if(error){
    sails.log(error);

      // Check whether one was successful and remove it
      return res.json({errorMsg: error});
    }

});
  

вы можете использовать либо прямую отправку ответа клиенту, либо использовать обратный вызов (ошибка)