我有这个使用promises并且工作正常的函数:
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!");
}
});
}
如您所见,每个函数都返回我需要在nextfunction中使用的值。但是我还需要聚合各种返回值,因为这些是解析函数应该重新开始的。 removeExtermePoints甚至返回一个对象!
我很好地重构了解析函数,所以当我不确定如何继续时,子函数也会使用promises。我看起来的代码基本上是这样的:
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
用于另一个用例。我该怎么做呢?