Обещание отклонено Возможно необработанная ошибка:

У меня есть функция, которая выполняет некоторую операцию с использованием массива. Я хотел бы отклонить его, когда массив пуст.

В качестве примера

myArrayFunction(){
        return new Promise(function (resolve, reject) {
           var a = new Array();
           //some operation with a
           if(a.length > 0){
               resolve(a);
           }else{
               reject('Not found');
           }           
        };
}

Когда происходит операция отклонения, я получаю следующую ошибку. Возможно необработанная ошибка: не найдена

Однако при вызове myArrayFunction() у меня есть следующий catch.

handlers.getArray = function (request, reply) {
    myArrayFunction().then(
        function (a) {
            reply(a);
        }).catch(reply(hapi.error.notFound('No array')));
};

Каким будет правильный способ отклонить обещание, поймать отказ и ответить клиенту?

Спасибо.

Ответ 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(...))