我有一个控制器,它接受API调用/任务/:id/start。我的控制器方法需要检查Task是否有效,如果有效,则需要创建另外两个模型实例。我需要创建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");
});
});发布于 2015-02-16 06:19:35
这应该是可行的:
TaskSetEvent.create({
eventType: 'start',
taskSet: {
task: myTask
}
})
.then(function (taskSetEvent) {
console.log('should be done here');
});如果通过控制器端点执行此操作,则不需要编写任何代码。只需POST嵌套的对象。
发布于 2015-02-16 12:22:47
你的代码一切都很好。无论如何,当有更多的嵌套函数代码变得难以阅读和维护时,称为意大利面代码或回调地狱。
在JavaScript中,解决回调问题的常见方法是使用承诺或使用特殊工具,如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保存在您的globals中。
https://stackoverflow.com/questions/28534703
复制相似问题