Я знаю, что лучший способ цепи обещаний в Nodejs/Экспрессе как:Лучшая практика для построения цепочки обещаний Nodejs/Экспресс
doSomeThing()
.then()
.then()
.catch();
Но недавно пришлось использовать асинхронный и Q модуль перебрать список/array и запустить функцию async. Я хотел бы знать, что есть лучший способ сделать/пишу это -
var deferred = Q.defer();
var deferred2 = Q.defer();
models.Local.findOne({
where: {
id: parseInt(req.body.localid)
}
})
.then(function(resultLocal){
if(!resultLocal){
return res.status(404).json(
{
"status" : "error",
'error': "Local Not Found"
});
}
return models.Documents.create(req.body.document);
})
.then(function(docCreated){
var attributes = req.body.document.Attributes;
async.each(attributes, function(item, callback) {
models.Doc_Tags.create({
value: item.value,
attribute_id: item.id,
document_id: docCreated.id
})
.then(function(attributeCreated){
var upObj = {};
upObj[item.col_name] = item.value;
models[item.table_name].update(upObj,{
where:{
id: req.body.document.local_id
}
})
.then(function(primaryUpdated){
deferred2.resolve();
})
.catch(function(error){
return res.status(400).json({status: 'error', error:error.message});
});
deferred2.promise
.then(function(){
callback();
})
.catch(function(error){
return res.status(400).json({status: "error", error: error.message});
});
})
.catch(function(error){
return res.status(400).json({status: 'error', error:error.message});
});
}, function(err,r){
if(err) {
return res.status(400).json({status: 'error', error:err.message});
} else {
console.log('All attributes Associated');
deferred.resolve(docCreated);
}
});
deferred.promise.then(function(result, attributes){
var obj = req.body.Local;
models.Local.update(obj, {
where: {
id: result.local_id
}
})
.then(function(resultUpdate){
return res.status(201).json({status: "success", document: result});
})
.catch(function(error){
return res.status(400).json({status: "error", error: error.message});
});
})
.catch(function(error){
return res.status(400).json({status: "error", error: error.message});
});
})
.catch(function(error){
return res.status(400).json({status: "error", error: error.message});
});
Пожалуйста, поправьте меня, если я делаю что-то неправильно. Функциональность мудрый код работает правильно, но я думаю, что я могу реорганизовать его как-то выглядеть и читать лучше.
Спасибо.
Не использовать 'async.js' вместе с обещаниями - это самая важная хорошая практика здесь. – Bergi
@AlongkornChetasumon Вы не можете просто добавить тег [tag: Bluebird] к вопросу, когда OP не использует эту библиотеку! – Bergi
Посмотрите на [отложенный антипаттерн] (http://stackoverflow.com/q/23803743/1048572) и как его избежать. – Bergi