繁体   English   中英

Sailsjs创建对象-嵌套创建

[英]Sailsjs create objects - nested creations

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

这应该工作:

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

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

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

在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方法运行一系列函数,每个函数将结果传递给下一个函数。

不用说,如果您想频繁使用异步,则不必每次都在模块中要求它,只需通过npm进行安装并在全局配置中保存async: true

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM