web-dev-qa-db-ja.com

bluebirdでJSON.parseメソッドを正しく約束する方法

私は約束しようとしていますJSON.parse方法ですが、残念ながら運がありません。これは私の試みです:

Promise.promisify(JSON.parse, JSON)(data).then((result: any) => {...

しかし、私は次のエラーが発生します

Unhandled rejection Error: object
10
Mazzy

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(…);
20
Bergi

パーティーに遅れましたが、例外をスローしない約束された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)
9
mtkopone

まず第一に、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を実行します。

7
thefourtheye