私は約束を使用し、正しく動作しているこの関数を持っています:
parse: function (fileAsString, options) {
return when.promise(function(resolve, reject){
if (fileAsString.length) {
var metaData = options || {};
var points = extractPointsFromPCD(fileAsString);
var cleanedPoints = cleanPoints(points);
var cordsAndRGBs = createCoordinateAndRGBObjects(cleanedPoints);
var res = removeExtremePoints(3, cordsAndRGBs);
var pcdContainer = {
coordinateAndRGBObjs: res.points,
average: res.average,
metaData: metaData,
fileString: fileAsString
};
// TODO: do meaningful test
if(res && res.points && res.average && metaData && fileAsString){
resolve(pcdContainer);
} else {
// TODO: add actual error
reject("something went wrong");
}
} else {
console.log(LOG + "No file!");
}
});
}
ご覧のとおり、すべての関数は、next 関数で使用する必要がある値を返します。しかし、さまざまな戻り値を集計する必要もあります。これらは parse 関数が返す値だからです。removeExtermePoints はオブジェクトを返します!
解析関数をリファクタリングする途中で、どうすればよいかわからないときに subFunctions も promise を使用できるようにしました。私が持っていたコードは基本的に次のように見えました:
parse: function (fileAsString, options) {
return when.promise(function(resolve, reject){
if (fileAsString.length) {
var metaData = options || {};
extractPointsFromPCD(fileAsString)
.then(cleanPoints)
.then(createCoordinateAndRGBObjects)
.then(removeExtremePoints)
.done(function(pcdContainer){
resolve(pcdContainer);
});
} else {
reject(LOG + "No file to parse!");
}
});
}
質問1
単一の戻り値への参照はもうありません。最初のプロミスに渡すオブジェクトを使用して、次のすべてにプッシュし続け、値を追加して返すことができると思いますが、それが私が持っていたものに到達する良い方法であるかどうかはわかりません最初のスニペットで気になりませんか?
質問2
removeExtremePoints
入力として要素を取り、私はそのように保ちたいです。resolve(3, result)
で使用できると思いますcreateCoordinateAndRGBObjects
か?私は本当にこれが好きではありません。なぜなら、突然、関数createCoordinateAndRGBObjects
がどのように実行したいかを決定するからですremoveExtremePoints
。むしろ、パースボディでパラメーターを定義したいと思います。
また、ある時点で何かを変更した場合、その後の約束は別のユースケース向けでcreateCoordinateAndRGBObjects
はない可能性があります。removeExtremepoints
どうすればいいですか?