私はNode.jsアプリを持っています。このアプリには、プロセスを開始するボタンがあります。そのプロセスのステップは約束を返します。私はこれらの約束を一緒に結びつけようとしています。何らかの理由でUnhandledPromiseRejectionWarning
が届いています。しかし、私の心の中で、私はこれを正しく設定しました。私のコードは次のようになります。Node.js:未処理の約束拒否 - UnhandledPromiseRejectionWarning
var myButton = document.getElementById('myButton');
if (myButton) {
console.log('here');
myButton.addEventListener('click', executeAction('0'));
}
function executeAction(input) {
let param1 = 'A';
let promise = new Promise(function(resolve, reject) {
try {
executeStep1()
.then(result => executeStep2(param1, result, input))
.then(result => function(result) {
console.log('All done');
resolve(result);
})
.catch(err => reject(err))
;
} catch (ex) {
reject(ex);
}
});
return promise;
}
function executeStep1() {
let promise = new Promise(function(resolve, reject) {
try {
setTimeout(function() {
resolve('[something]');
}, 3000);
} catch (ex) {
reject();
}
});
return promise;
}
function executeStep2(p1, p2, p3) {
let promise = new Promise(function(resolve, reject) {
try {
setTimeout(function() {
console.log('step 2 has executed');
resolve('awesome!')
}, 3000);
} catch (ex) {
reject(ex);
}
});
return promise;
}
私はexecuteStep2
関数が完了するまで実行されることを確認しました。私は、コンソールウィンドウで「ステップ2が実行された」ことがわかるという事実に基づいています。しかし、驚いたことに、コンソールウィンドウに「すべて完了」と表示されることはありません。代わりに、私は上記のUnhandledPromiseRejectionWarning
を参照してください。私はこの結果について2つのことを理解していません。
- コンソールで「すべて完了」と表示されないのはなぜですか?
executeStep2
が解決した後でその関数を実行してはいけませんか? - 拒否はどこから来ていますか?私はこれを拒否する何も見ていない。
ありがとうございました!
ミドルウェア、高階関数、リスナー、ログ記録などのエラー処理を使用することができます。関数を宣言するためにすでに矢印関数の構文を使用しています。 –
[Promise'コンストラクタの反パターン](https://stackoverflow.com/q/23803743/1048572?What-is-the-promise-construction-antipattern-and-how-to-avoid-it)を避けてください! Btw、 '新しい{Promise'}コールバックで' try {...} catch(err){reject(err)} 'を呼び出す必要はなく、コンストラクタは自動的にそれを行います。 – Bergi
あなたの 'executeStep2'の' '[something] ''は実際には例外をスローする可能性のある式ですか? – Bergi