2017-10-17 35 views
-1

私は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つのことを理解していません。

  1. コンソールで「すべて完了」と表示されないのはなぜですか? executeStep2が解決した後でその関数を実行してはいけませんか?
  2. 拒否はどこから来ていますか?私はこれを拒否する何も見ていない。

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

+0

ミドルウェア、高階関数、リスナー、ログ記録などのエラー処理を使用することができます。関数を宣言するためにすでに矢印関数の構文を使用しています。 –

+0

[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

+0

あなたの 'executeStep2'の' '[something] ''は実際には例外をスローする可能性のある式ですか? – Bergi

答えて

0
executeStep1() 
    .then(result => executeStep2(param1, result, input)) 
    .then(result => { // no function(result) here 
     console.log('All done'); 
     resolve(result); 
    }) 
    .catch(err => reject(err)) 
    ; 
+1

これはより近いです。私はそれを実行するときもはやハングしません。しかし、私はまだ 'UnhandledPromiseRejectionWarning'エラーを受け取ります。 –

0

エラーは、あなたが約束を使用する機能(複数可)を呼び出したときから生成されます。

myButton.addEventListener('click', executeAction('0')); 

ます。また、そこに拒否をキャッチする必要があります。 executeAction('0')は約束を返すため

myButton.addEventListener('click', executeAction('0') 
    .catch((error) => console.log('ERROR', error)); 

拒否はなく、外側のスコープで、関数内キャッチされ、またはその約束を作成し、返すので、それはしかし、あなたは、非非同期機能としてそれを使用していますそれが解決されるのを待たずに保留中の約束をしている。それは拒絶の原因となっているように見え、その理由も上記の理由で処理されていません。

これは、それを修正します:あなたは非同期になります

function executeAction(input) {  
    let param1 = 'A'; 
    return 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); 
    } 
    }); 
} 

/待っています。このコードを大幅に整理できます。その後、

async function getSomething() { 
 
     try { 
 
     // throw 'Test error detected.' 
 
     return 'test' 
 
     } 
 
     catch (e) { 
 
     throw e 
 
     } 
 
    } 
 
    
 
    async function testing() { 
 
     try { 
 
     const sample = await getSomething() 
 
     return sample 
 
     } catch (e) { 
 
     throw e 
 
     } 
 
    } 
 
    
 
    testing() 
 
     .then((data) => console.log(data)) 
 
     .catch((err) => console.log(err))

を実行し、この上の例、およびコメントを外し投げます。最大の勝利のためにこのパターンを使用してください。例外は、関数が呼び出される、表示される、使用される、レンダリングされるなどのサーフェスレベルにスローされる必要があります。関数は単純にエラーをスローする必要があります。

これは、 ``二then`関数(結果を) `削除

関連する問題