#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});
}
});
вы можете использовать либо прямую отправку ответа клиенту, либо использовать обратный вызов (ошибка)