我有一个接受API调用/ task /:id / start的控制器。我的控制器方法需要检查具有id的Task是否有效以及是否有效,那么我需要创建2个其他模型实例。我需要创建TaskSet
然后TaskSetEvents
。
TaskSet
要求创建任务,TaskSetEvents
需要创建TaskSet
。以下是我计划创建这些事件的方法。我不确定是否有更好的方法来创建这些对象。
TaskSet.create({ task: task}).exec(function(err, taskSet) {
TaskSetEvent.create({ taskSet: taskSet, eventType: 'start'}).exec(function (err, taskSetEvent) {
console.log("Everything created ok");
});
});
答案 0 :(得分:1)
这应该可行:
TaskSetEvent.create({
eventType: 'start',
taskSet: {
task: myTask
}
})
.then(function (taskSetEvent) {
console.log('should be done here');
});
如果您是通过控制器端点执行此操作,则不必编写任何代码。只需POST
您的嵌套对象。
答案 1 :(得分:1)
您的代码一切都很好。无论如何,当有更多嵌套函数代码变得难以阅读和维护时,称为意大利面条代码或回调地狱。
在JavaScript中,解决回调问题的常用方法是使用promises或使用特殊工具,如async.js。
对于您的代码段async.waterfall()
是明确的方法。你可以用这样的方式重写它:
async.waterfall([
function(cb) {
TaskSet.create({ task: task}).exec(cb);
},
function(err, taskSet, cb) {
TaskSetEvent.create({ taskSet: taskSet, eventType: 'start'}).exec(cb);
}
], function(err, taskSetEvent) {
console.log('Everything created ok');
});
waterfall
方法运行一系列函数,每个函数都将结果传递给下一个。
不值得说,如果你想经常使用异步,没有必要在模块中每次都要求它,你可以通过npm安装它并在你的全局配置中保存async: true
。