2016-10-20 12 views
1

私は基本的に同じことをするこれらの3つの機能を持っています。彼らは約束から来るデータを受け取り、各機能について同じ性質を持つオブジェクトを作る。オブジェクトのプロパティを関数の引数として渡しますか?

私はこれを乾燥したいと思います:

var getFiles = function() { 
    return wg.getFiles().then(function(data) { 
     processData(data, { 
      type: "File", 
      title: x.filename, 
      created: x.Created, 
      path: x.path 
     }) 
    }) 
} 

var getEvents = function() { 
    return wg.getEvents().then(function(data) { 
     processData(data, { 
      type: "Event", 
      title: x.Title, 
      created: x.Created, 
      path: x.path 
     }) 
    }) 
} 

var getFeedback = function() { 
    return wg.getFeedback().then(function(data) { 
     processData(data, { 
      type: "Review", 
      title: "by " + x.Author, 
      created: x.Created, 
      path: x.path 
     }) 
    }) 
} 
var processData = function(data, props) { 
    var x = _(data) 
    .map(function(x) {return props}) 
    .value() 
.map(function(x) { 
    activties.push(x) 
}) 
} 

私はこのような何かにprocessData機能を変更することで、これを乾かすしたいと思います:

var processData = function(data, props) { 
    var x = _(data) 
    .map(function(x) { 
     return { 
      type: x[props[0]], 
      title: x[props[1]], 
      created: x[props[3]], 
      path: "/" + x[props[4]] 
     } 
    }) 
    .value() 
.map(function(x) { 
    activties.push(x) 
}) 
} 

それから私はこのようにそれを呼び出すことができます:

var getFiles = function() { 
    return wg.getFiles().then(function(data) { 
     processData(data, ['filename', 'created', ['FileRef']['lookupValue']]) 

    }) 
} 

これは私が心に留めていることですが、誰でも賭けているものがあれば私は開いている。

+2

あなたの現在のアプローチには何か問題があると思いますか?確かに、 'processData()'メソッドは少し見苦しく見えますが、他のすべてのものを読みやすくするためにはうまくいきます。 – Archer

+0

processData fnのパラメータの順序を逆転させることができます。関数(データ、小道具)から関数(小道具、データ)まで、そして必要ならば部分的なアプリケーションの恩恵を受ける。 – Delapouite

+0

@Archer私は何か間違っているとは言いませんが、達成するためには可能かシンプルであればコードをDRYにしておくのが好きです。これをDRYしようとすると余分に20行のコードが生成されますが、それは努力する価値がありません。しかし、それが簡単であれば、どうやって学びたいのですか? – Batman

答えて

1

は、プロパティ名を渡す機能を渡さないでください:便宜上

function getFiles() { 
    return wg.getFiles().then(processData("File", _.property("filename"))); 
} 

function getEvents() { 
    return wg.getEvents().then(processData("Event", _.property("Title"))); 
} 

function getFeedback() { 
    return wg.getFeedback().then(processData("Review", function(x) { return "by " + x.Author; }))); 
} 

function processData(type, makeTitle) { 
    return function(data) { 
     return data.map(function(x) { 
      return { 
       type: type, 
       title: makeTitle(x), 
       created: x.Created, 
       path: x.path 
      }; 
     }); 
    }; 
} 

Promise.all([getFiles(), getEvents(), getFeedback()]) 
.then(function(arrays) { 
    var activities = _.flatten(arrays); 
    … 
}); 

は、私はいくつかのアンダースコア/ lodash機能を使用していますが、同様にそれらなしでそれを行うことができます。

+0

私は、 'wg'オブジェクトから戻ってきたプロパティをクリーンアップして一貫性を持たせることで、問題全体をより簡単にすることに気付きました。 – Batman

+1

はい、問題を解決する方法は同じです:-)それらがクリーンアップされていない場合は、違いごとに1つのコールバック関数を使用するだけです。 – Bergi

+0

私は '_.prop()'と 'makeTitle(x)'を実際に理解していないし、今日どのように動作しているのか分かりません。私はそれのためのドキュメントを見つけることを試みているが、私は何も見ていない。 – Batman

関連する問題