私は約束しようとしていますJSON.parse
方法ですが、残念ながら運がありません。これは私の試みです:
Promise.promisify(JSON.parse, JSON)(data).then((result: any) => {...
しかし、私は次のエラーが発生します
Unhandled rejection Error: object
Promise.promisify
は、コールバック関数を受け取る非同期関数と考えられています。 JSON.parse
はそのような関数ではないため、ここではpromisify
を使用できません。
同期的にthrow
する可能性のある関数からpromiseを返す関数を作成する場合は、 Promise.method
が次の方法です。
var parseAsync = Promise.method(JSON.parse);
…
parseAsync(data).then(…);
または、 Promise.resolve
を使用してチェーンを開始することもできます。
Promise.resolve(data).then(JSON.parse).then(…);
パーティーに遅れましたが、例外をスローしない約束されたJSON解析メソッドが必要な理由は完全に理解できます。それ以外の場合は、コードから定型的なtry/catch-handlingを削除します。また、同期動作をpromiseでラップするべきではない理由もわかりません。だからここに:
function promisedParseJSON(json) {
return new Promise((resolve, reject) => {
try {
resolve(JSON.parse(json))
} catch (e) {
reject(e)
}
})
}
使用法、例:
fetch('/my-json-doc-as-string')
.then(promisedParseJSON)
.then(carryOn)
.catch(dealWithIt)
まず第一に、JSON.parse
は非同期関数ではありません。だから、それを約束しようとしないでください。
JSON.parseが一番上に立つ一連のpromiseを作成したいからです
次に、次のように、解析されたJSONオブジェクトで解決されたPromiseを作成するだけです。
Promise.resolve(JSON.parse(data))
.then(...)
さて、あなたの実際の質問に対して、あなたはエラーを受け取っています、
Unhandled rejection Error: object
なぜなら、約束の連鎖が拒否された場合、あなたはそれを処理していないからです。したがって、このようにキャッチハンドラーをアタッチすることを忘れないでください
Promise.resolve(JSON.parse(data))
.then(...)
.catch(...)
これを読んでくださいコメントでBergiが指摘したように、ここで示したアプローチには問題があります。 JSON.parse
呼び出しが失敗した場合、エラーは同期的にスローされるため、Promise
コードの周囲にtry...catch
を記述する必要がある場合があります。代わりに、Bergiが 彼の答え で提案したように、データだけでPromiseオブジェクトを作成し、そのPromiseチェーンでJSON.parse
を実行します。