Ich habe den folgenden Code:Javascript-Versprechung, warum ist unbehandelt zurückzuweisen?
function validateRole(message, cmdCalled) {
return new Promise(function(resolve, reject) {
winston.debug('Checking user\'s role');
Game.findOne({
running: true,
'players.id': message.author.id
}, {
'players.$': 1
}).then(function(result) {
console.log(result);
if (!result) reject('playerNotFound');
if (cmdCalled === 'vote' && result.players[0].role.match(/wolf/gi)) {
message.author.send('Wolves are not allowed to vote!');
reject('voteDenied');
}
}, reject).catch(function(err) {
winston.debug(err);
});
});
}
validateRole(message,'someCommand').then(...)
Wenn eine der bedingten Anweisungen scheitere ich error: Unhandled Rejection at: Promise Promise { <rejected> 'voteDenied' } reason: voteDenied
bekommen. Warum wird das nicht durchgefangen? Oder ist dies der falsche Weg, um mit Dingen umzugehen, wäre es besser, einfach mit einem falschen Wert oder etwas aufzulösen und das Ergebnis in der then() Funktion zu behandeln?
Art eines beiseite zu handhaben: Da 'Game.findOne' Rückkehr bereits ein Versprechen, was ist der Punkt eine' neue Promise' machen um es zu wickeln? Was macht dein neues Versprechen, dass das Versprechen, das aus 'Game.findOne' kommt, nicht geht? – apsillers
So kann ich auflösen ('benutzerdefinierte Antwort'), wenn nötig und verwenden Sie das in .then(). – Trax
Sie meinen, dass Sie 'resolve' außerhalb eines' then' verwenden möchten? Andernfalls, wenn Sie nur 'resolve' innerhalb eines' then' aufrufen möchten, können Sie stattdessen 'return' zurückgeben, da der Rückgabewert eines vorherigen' then' als Argument an ein folgendes 'then' übergeben wird. Das heißt, 'return Game.findOne (...). Then (function() {return" custom response "}). Catch (...);' würde 'benutzerdefinierte Antwort' an Ihre äußere 'validateRole (.. .). dann (...); 'Funktion. – apsillers