web-dev-qa-db-ja.com

おそらく未処理のエラーを拒否する約束:

配列を使用して何らかの操作を行う関数があります。配列が空の場合は拒否します。

例として

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()の呼び出しが行われると、次のような問題が発生します。

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

約束を拒否し、拒否をキャッチし、クライアントに応答する正しい方法は何でしょうか?

ありがとうございました。

13
Juan

.catchは関数をパラメーターとして受け取りますが、別のものを渡します。キャッチする関数を渡さないと、何もせずに黙って失敗します。愚かですが、それがES6の約束です。

.catchは何もしていないため、拒否は処理されずに報告されます。


修正は、関​​数を.catchに渡すことです:

handlers.getArray = function (request, reply) {
    myArrayFunction().then(function (a) {
        reply(a);
    }).catch(function(e) {
        reply(hapi.error.notFound('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(...))
18
Esailija