Sailsjs 创建对象——嵌套创建

Sailsjs create objects - nested creations

我有一个控制器接受 API 调用 /task/:id/start。我的控制器方法需要检查 Task with at id 是否有效,如果有效,那么我需要创建另外 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");
    });
});

这应该可以正常工作:

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

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

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

在 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 在你的全局配置中。