配列を使用して何らかの操作を行う関数があります。配列が空の場合は拒否します。
例として
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')));
};
約束を拒否し、拒否をキャッチし、クライアントに応答する正しい方法は何でしょうか?
ありがとうございました。
.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(...))