Ответ 1
.catch
принимает функцию как параметр, однако вы передаете ему что-то еще. Когда вы не передадите функцию, чтобы поймать ее, она просто ничего не сделает. Глупо, но что ES6 promises делает.
Поскольку .catch
ничего не делает, отклонение становится необработанным и сообщается вам.
Исправление - передать функцию .catch
:
handlers.getArray = function (request, reply) {
myArrayFunction().then(function (a) {
reply(a);
}).catch(function(e) {
reply(hapi.error.notFound('No array')));
});
};
Поскольку вы используете catch, ошибка не обязательно является ошибкой No array. Я предлагаю вам сделать это вместо этого:
function myArrayFunction() {
// new Promise anti-pattern here but the answer is too long already...
return new Promise(function (resolve, reject) {
var a = new Array();
//some operation with a
if (a.length > 0) {
resolve(a);
} else {
reject(hapi.error.notFound('No array'));
}
};
}
}
function NotFoundError(e) {
return e.statusCode === 404;
}
handlers.getArray = function (request, reply) {
myArrayFunction().then(function (a) {
reply(a);
}).catch(NotFoundError, function(e) {
reply(e);
});
};
Который может быть дополнительно сокращен до:
handlers.getArray = function (request, reply) {
myArrayFunction().then(reply).catch(NotFoundError, reply);
};
Также обратите внимание на разницу между:
// Calls the method catch, with the function reply as an argument
.catch(reply)
и
// Calls the function reply, then passes the result of calling reply
// to the method .catch, NOT what you wanted.
.catch(reply(...))