1

我有一个接受 API 调用 /task/:id/start 的控制器。我的控制器方法需要检查带有 at 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");
    });
});
4

2 回答 2

1

这应该只是工作:

TaskSetEvent.create({
    eventType: 'start',
    taskSet: {
      task: myTask
    }
  })
  .then(function (taskSetEvent) {
    console.log('should be done here');
  });

如果您通过控制器端点执行此操作,则不必编写任何代码。只是POST你的嵌套对象。

于 2015-02-16T06:19:35.250 回答
1

您的代码一切正常。无论如何,当有更多的嵌套函数时,代码变得难以阅读和维护,这就是所谓的意大利面条代码或回调地狱。

在 JavaScript 中,解决回调问题的常用方法是使用 Promise 或使用特殊工具,例如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方法运行一系列函数,每个函数将结果传递给下一个。

不值得一提的是,如果你想经常使用 async,你不需要每次在你的模块中都需要它,你可以通过 npm 安装它并保存async: true在你的 globals 配置中。

于 2015-02-16T12:22:47.467 回答