我一直在寻找解决我的厄运金字塔的方法。到目前为止我想出的是:
router.use('/create',
function(res,req,next)
{
try
{
var data =
{
startDate: new Date(req.body.startDate),
endDate: new Date(req.body.endDate),
details: req.body.details,
file:req.body.file,
filename:req.body.filename,
fileType:req.body.fileType
};
res.data = data;
next()
}catch(e)
{
res.end(JSON.stringify({complete:"false",error:e}));
return;
}
},
function(res,req,next){...},
function(res,req,next)
{
if(res.status.file)
{
var sql = "";
sql = 'insert into attachments values(' + id + ',"' + data.file + '","' + data.filename + '","' + data.fileType + '");';
db.exec(sql, function(err)
{
if(err)
{
res.end(JSON.stringify({
complete: "false",
error: err + " Contact 1-915-400-0823 NOW this left dirty data in the database"
}));
return;
}
res.delegateID = this.lastID;
next()
});
}
else
{
next()
}
},
function(res,req,next){...},
function(res,req,next){...},
);
每个功能都执行一项更新数据库,发送电子邮件和验证的任务。我在每次回调后使用next()
来调用流中的下一个函数;跳过任何不需要的任务。这是一个很好的解决方案,还是我应该使用别的东西?
答案 0 :(得分:3)
根据您发布的代码,您似乎应该使用生成器功能。
Generator函数返回一个iterable。然后使用.next()
函数推进Generator,它将在函数完成或yield
语句时暂停。
在您的情况下,代码将被重构为具有function*
语句的单个yield
,您需要它来等待数据。然后,您可以在收到该数据后致电.next()
并前往该功能的下一部分。
我还建议您查看 Promises 。然后你可以运行生成器直到yield
语句并从中返回一个promise。只有在返回的承诺解决后,才会进入下一个yield
语句。