2017-04-14 11 views
2

約束の外にあるエラー(以下の「新しいエラー」など)はどのように処理しますか?Js約束拒否の扱い

function testError() { 
    throw new Error("new error") // how to handle this? 
    var p123 = new Promise(function(resolve, reject) { 
     resolve(123) 
    }); 
    return p123 
}; 

testError().catch(err => { 
     return err; // code doesn't come here 
    }) 
    .then(ok => { 
     console.log(ok) 
    }); 
+1

使用 'あなたが動作するように)(.catchのための約束関数内のエラーをスローする必要がありますcatch' – Dummy

+1

/試してみてください。彼らはいつも約束を返します。 – Shilly

+0

[JSの約束を使用して非同期エラーをキャッチするにはどうすればよいですか?](http://stackoverflow.com/questions/42755042/how-can-i-catch-an-asynchronous-error-using-js-promises/42755300# 42755300) – guest271314

答えて

4

あなたは機能を同期スロー(または値を返す)するかどうかわからない場合、あなたは.then()を使用して、それを呼び出すことができます。

function testError() { 
 
    throw new Error("new error") // how to handle this? 
 
    var p123 = new Promise(function(resolve, reject) { 
 
    resolve(123) 
 
    }); 
 
    return p123 
 
}; 
 

 
Promise.resolve() 
 
    .then(testError) 
 
    .catch(err => { 
 
    console.error(err); 
 
    return err; 
 
    }) 
 
    .then(ok => { 
 
    console.log(ok.message) 
 
    });

0

エラーが非同期コードを必要としないので、通常のtry-catchがここに罰金を行う必要があります。結果は一貫し、それがどのように生成されるかに関係なく処理されるように、これはそれをラップします:

try { 
    testError().catch(err => { 
    return err; // code doesn't come here 
    }) 
    .then(ok => { 
    console.log(ok) 
    }); 
} 
catch(e) { 
    // 
} 

async-awaitパターンが最終的に約束を解決するネイティブな方法になると、try-catchもエラーを処理するネイティブな方法となりますので注意してください:

try { 
    var ok = await testError(); 
    console.log(ok) 
} 
catch(e) { 
    console.log('e:' +e); 
} 

1を簡単に確認することができるように、この1は正しく同期および非同期エラーの両方を処理し、then-catchよりもはるかにきれいです。

+0

これはうまくいくが、ロジックフローが非常に乱雑になり、約束が提供する一貫性が損なわれる。 – JLRishe

+0

@JLRishe:私の答えでこれを扱いました。「try-catch」は、究極の統一性を提供します。 –

+0

'async' /' await'が利用可能であるが、利用可能でないときはそうではありません。 – JLRishe

0

エラーは約束の外に投げられるので、約束のcatch文を使用してそれを捕らえることはできません。

代わりにtry/catchを使用してエラーをキャッチできます。

function testError() { 
    throw new Error("new error") // how to handle this? 
    var p123 = new Promise(function(resolve, reject) { 
     resolve(123) 
    }); 
    return p123 
}; 

try { 
    testError().then(ok => { 
    console.log(ok) 
    }); 
} catch (err) { 
    console.log(err.message); 
} 
0

あなたは、そう

function testError() { 
 
    return new Promise(function (resolve, reject) { 
 
    throw new Error('new error') 
 
    resolve(123) 
 
    }) 
 
} 
 

 
testError().then(ok => console.log(ok), 
 
       err => console.error(err.message))

  1. ランのようなあなたのtestError機能を書き換えることができる場合には、一度それが出console.error
  2. コメントthrowにエラーを投げる見るために約束が正常に解決するのを見るための行
0

例外と拒否の両方のために、発信者のチェックを行うので、あなたは、それを書き換えるにはアンチパターンです:

function testError() { 
 
    return Promise.resolve().then(() => { 
 
    throw new Error("new error"); // rejects returned promise 
 
    return new Promise(function(resolve) { 
 
     resolve(123); 
 
    }); 
 
    }); 
 
} 
 

 
testError().catch(err => console.log("Caught " + err));

これはasync機能を持つ暗黙的です。

async function testError() { 
 
    throw new Error("new error"); // rejects implicit promise 
 
    return await new Promise(function(resolve) { 
 
    resolve(123); 
 
    }); 
 
} 
 

 
testError().catch(err => console.log("Caught " + err));

関連する問題