2016-11-10 13 views
0

正しく記憶されている場合Promise.catch()を使用してそのエラーを処理できるように、常に約束がスローされるとエラーが発生するはずです。私は何か例外を思い出しませんが、内部でエラーを投げるときsetTimeout()これは何とか動作しません。エラーが正しくキャッチされないという約束NodeJS

これはなぜ機能しないのか誰かが説明できますか?それともNodeJSのバグですか?

テストコード

// This works! 
function async() { 
     return new Promise(function (resolve, reject) { 
       throw new Error('test'); 
     }); 
} 

async().catch(function() { 
     console.log('Ok: 1'); 
}); 


// This doesn't work.. 
function async_fail() { 
     return new Promise(function (resolve, reject) { 
       setTimeout(function() { 
         throw new Error('test'); 
       }, 1); 
     }); 
} 

async_fail().catch(function() { 
     console.log('Ok: 2'); 
}); 
+1

なぜあなたは '約束内setTimeout'必要がありますか...あなたならば'BlueBird'を使用していますが、' .delay'はうまく動作しませんか? http://bluebirdjs.com/docs/api/promise.delay.html –

+0

@DavidEspinoあなたが正しいですが、私が使用するnpmパッケージの1つが '' 'setTimeout'''を使用している場合はどうなりますか? '' Promise.catch'''がトリガしないので、私のコードはクラッシュするでしょう:/私はこれが起こったことを知りたいのです。 –

+0

そして、あなたは 'setTimeout'が実行するものを制御できません。もしあなたが私がそれが正しいかどうか、あるいはその機能の中で約束を「解決する」か「拒否する」と思っているのでしょうか?このhttp://stackoverflow.com/questions/22707475/how-to-make-a-promise-from-settimeout ...を参考にしてみてください。たぶん役立つでしょう... 'npm'パッケージのほとんどは'コールバック'ベースなので...' setTimeout'を内部的に実行するパッケージを持っていると思います... 95%が 'callback'オプションを持っていると確信しています...もしそうでなければ... IMHOはbaaaadのnpmパッケージです:) ... –

答えて

0

それは約束の機能を実際に実行に非同期に実行されるためあなたは、setTimeoutメソッドでスローされたエラーをキャッチすることはありません。したがって、set timeout内の関数が呼び出されると、約束そのものはすでに終了しています(解決または拒否の呼び出しなし)。

あなたは約束をしたsetTimeout内部エラーに基づいて失敗する場合は、手動でそれをキャッチし、拒否呼び出す必要があります:

setTimeout(function() { 
    try{ 
      throw new Error('test'); 
    }catch(ex){ 
      reject(ex); 
    } 
}, 1); 
+0

か、彼は約束されたバージョンの 'setTimeout'を使うことができますか? – Tom

+0

@確かに可能ですが、そのような有名な 'setTimeout'のバニラjs版は分かりませんので、使用しているライブラリ/ラッパーに依存するかもしれません。一般的に私はこれらのラッパーのいずれかがsetTimeout内のエラーをキャッチしてあなたの約束を拒否することを期待しています。 – Tobi

関連する問題