【问题标题】:Sailsjs create objects - nested creationsSailsjs 创建对象 - 嵌套创建
【发布时间】:2015-04-16 13:36:33
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

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

    在 JavaScript 中解决回调问题的常用方法是使用 Promise 或使用特殊工具,例如 async.js。

    对于您的代码,sn-p 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 保存在你的全局配置中。

    【讨论】:

      【解决方案2】:

      这应该可以工作:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-10-06
        相关资源
        最近更新 更多