Sailsjs创建对象 - 嵌套创建

时间:2015-02-16 04:48:13

标签: javascript sails.js sails-mongo sails.io.js

我有一个接受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");
    });
});

2 个答案:

答案 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