2015-11-20 67 views
1

使用loopbackjsnodejs/async:如何讓我的代碼容易理解

Somwhere在我的代碼中,我需要以非常自定義的方式驗證屬性,所以我不能使用可用的驗證器。

因此,我在考慮使用像這樣的:

var somevar = "someval"; 
var anothervar = "anothervar"; 
MyModel.createme = function(prop1, prop2, prop3, prop4, callback) { 
    async.parallel([ 
     verify_prop1, 
     verify_prop2, 
     verify_prop3, 
     verify_prop4 
    ], function(err, results) { 
    }); 
} 

然後我要創建功能異步:

//local methods 
var verify_prop1 = function(callback) { 

}; 

這裏就是我意識到我被卡住了。如果我在async.parallel調用中內聯編寫函數,我可以訪問函數參數prop1等,但是如何將它們加入到我的verify_propX函數中? async pararell的函數簽名是否被修復?我過分複雜的東西?

在另一個文件中,我在異步中使用了三個並行函數,它們相當大,所以它看起來不太好,編輯也變得很昂貴。

所以我想要一個乾淨的異步方法分離......我該怎麼做?

+1

*回調地獄:(異步)代碼是如此複雜/大,回調幾乎不可能維持甚至發展*。我目前正在與我的工作對抗,迫使異步JavaScript實現同步行動非常非常困難。 – x13

+0

這似乎應該可能有一個函數,並通過四個prop變量中的每一個調用該函數來循環,而不是編寫四個單獨的函數。然後,只需將代碼放入內聯代碼很容易,因爲它只是一個函數。如果你想要一個外部函數,那麼你可以調用它並從內聯核心代碼中傳遞適當的prop變量。 – jfriend00

回答

2

採取四個驗證功能可與傳遞給它們只是不同的參數相同的功能,則可以通過從參數自動創建道具的數組,然後使用async.map()迭代乾燥該漲了不少該陣列並行:

var somevar = "someval"; 
var anothervar = "anothervar"; 
MyModel.createme = function(prop1, prop2, prop3, prop4, callback) { 
    async.map([].slice.call(arguments, 0, 4), function(item, done) { 
     // insert code here to verify the prop passed here as item 

     // call done(null, result) when the proccesing is done 
     done(null, result); 
    }, function(err, results) { 
     // array of data here in results 
    }); 
} 

既然你是不是真的準確指定什麼需要傳遞給你的工人功能和您的評論說,有些功能需要一個以上的道具的說法,你可以使用內聯和外部功能的混合離子呼叫。這可以讓你把在外部函數功能的肉,但你可以在本地做了設置在一個內聯函數,你可以訪問所有的參數:

var somevar = "someval"; 
var anothervar = "anothervar"; 
MyModel.createme = function (prop1, prop2, prop3, prop4, callback) { 
    async.parallel([ 
     function (done) { 
      verifyA(prop1, prop2, done); 
     }, 
     function (done) { 
      verifyB(prop3, done); 
     }, 
     function (done) { 
      verifyC(prop2, prop4, done); 
     } 
    ], function (err, results) { 
     // everything done here 
    }); 
} 

使用這種方式時,你可以組織你的並行操作任何你想要的方式,傳遞任何數量的參數給每一個。

+0

這是一個不錯的,但我只是意識到在一個功能,我需要兩個屬性:) – faboolous

+0

@faboolous - 你很難提供最好的答案,因爲沒有向我們展示你在這些功能中要做什麼。 – jfriend00

+0

@faboolous - 我添加了另一個選項,給你無限的靈活性。 – jfriend00

3
async.parallel([ 
    async.apply(verify_prop1, prop1), 
    async.apply(verify_prop2, prop2), 
    async.apply(verify_prop3, prop3), 
    async.apply(verify_prop4, prop4) 
    ], function(err, results) {