簡體   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