我有这个使用承诺并且工作正常的功能:
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!");
}
});
}
如您所见,每个函数都返回我需要在下一个函数中使用的值。但我还需要聚合各种返回值,因为这些是解析函数应该返回的值。removeExtermePoints 甚至返回一个对象!
我正在重构 parse 函数的路上,以便当我不确定如何继续时 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
用于另一个用例。我该怎么办?