У меня есть эта функция, которая использует обещания и работает правильно:
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: 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
для другого варианта использования. Как бы я поступил?
.then()
и асинхронным поведением. Лично я думаю, что вы немного заблуждаетесь относительно того, для чего лучше всего использовать промисы, а для чего лучше просто придерживаться традиционной функции, которая выполняет несколько вызовов других функций. - person jfriend00   schedule 14.10.2014.all
и.spread
(.join
в этих библиотеках разные) - person ldmat   schedule 14.10.2014