2016-04-27 5 views
0

無効なJSON文字列をチェックしてエラーをスローするスクリプトを作成しようとしています。私はこれを約束しています(彼らの働き方をよりよく理解するために)。バニラJSの約束事を理解しようとしています

function parsePromised(value) { 
    var promise = new Promise(
    function(fulfilled, rejected) { 
     try { 
     JSON.parse(value) 
     } catch (e) { 
     rejected(e) 
     } 
     fulfilled('fulfilled') 
    } 
) 
    console.log(promise) 
    return promise; 
} 

parsePromised('{"1": 1, "2": 2, "3": {"4": 4, "5": {"6": 6}}}').then(console.log); 

私は理解していないので、コンソールは3行(私のスクリプトのconsole.logは2行、エラーは1行)を返します。ここにあります:

私が理解しようとしているのは、最初のケースの出力と2番目のケースの出力が異なる理由と、エラーがスローされる理由です。私は約束をうまく呼び出すと思う。ありがとう!

+0

最終的なエラーは、 'console.log'が' this'またはconsoleをコンソールに設定する必要があるからです。呼び出されるとコンソールには設定されません。あなたは '.then(console.log.bind(console));'を実行する必要があります。 – ste2425

答えて

0

Illegal invocationは実際には約束とは関係ありません。ブラウザでは、.log()は、あなたがこのような何かしたいので、周りに渡されるときconsoleにバインドする必要があります。他の問題については

parsePromised('{"1": 1, "2": 2, "3": {"4": 4, "5": {"6": 6}}}') 
    .then(console.log.bind(console));

を、私は再現できない、私は一つだけの余分なラインを見ることができます。 https://jsfiddle.net/sbonrcxm/

+0

奇妙なのは、スクリプトを直接コンソールに貼り付けると、Chromeがこの2行目を確実に記録するためです。 私は間違ったJSON文字列を渡そうとしましたが、コンソールログには約束が込められていなかったと書かれていますが、約束の出力でも値がちょうど良いです。 プロミスは、{[[PromiseStatus]:[PromiseValue]、 "拒否": キャッチされない(約束に)にSyntaxError:予期しないトークン: – Dronich

+0

ああ、はい、それは理にかなっています。最初の行は評価された最後のステートメントを表示するコンソールで、2番目は 'console.log()'、3番目は '.then()'の 'console.log'です。 –

関連する問題