2015-08-31 1 views
8

Ich versuche, JSON.parse Methode promitifizieren, aber leider ohne Glück. Dies ist mein Versuch:Wie promisifiziere ich korrekt JSON.parse Methode mit Bluebird

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

aber ich bekomme die folgenden Fehler

Unhandled rejection Error: object 
+1

'JSON.parse' ist eine Sync-Funktion. Warum willst du es * promitrifizieren? – thefourtheye

+0

Weil ich eine Kette von Versprechen erstellen möchte, wo JSON.parse an der Spitze steht – Mazzy

+0

@Mazzy: Woher kommen deine 'Daten'? Können Sie uns Ihren vollständigen Code zeigen? Es könnte eine bessere Lösung geben. – Bergi

Antwort

13

Promise.promisify ist für asynchrone Funktionen gedacht, die eine Rückruffunktion übernehmen. JSON.parse ist keine solche Funktion, so dass Sie promisify hier nicht verwenden können.

Wenn Sie ein Versprechen-Rückkehr-Funktion aus einer Funktion erstellen möchten, die synchron throw könnte, ist Promise.method der Weg zu gehen:

var parseAsync = Promise.method(JSON.parse); 
… 

parseAsync(data).then(…); 

Alternativ können Sie nur Promise.resolve verwenden möchten Ihre Kette zu starten:

+0

Promise.resolve (...) funktionierte wie ein Zauber für mich. Vielen Dank! –

7

Zunächst einmal JSON.parse ist nicht eine asynchrone Funktion. Also, versuchen Sie nicht Promisify es.


Weil ich eine Kette von Versprechungen schaffen will, wo JSON.parse an der Spitze

Dann

steht, erstellen Sie einfach ein Versprechen, mit dem geparsten JSON-Objekt aufgelöst, wie diese

Promise.resolve(JSON.parse(data)) 
    .then(...) 

Nun zu Ihrer eigentlichen Frage, werden Sie den Fehler erhalten,

Unhandled rejection Error: object 

weil, wenn Ihre Kette von Versprechen abgelehnt wird, Sie es nicht behandeln. Also, vergessen Sie nicht, einen catch-Handler zu befestigen, wie diese

Promise.resolve(JSON.parse(data)) 
    .then(...) 
    .catch(...) 

LESEN Es gibt ein Problem mit dem Ansatz, den ich hier gezeigt habe, wie von Bergi wies darauf hin, in den Kommentaren. Wenn der Aufruf JSON.parse fehlschlägt, wird der Fehler synchron ausgelöst und Sie müssen möglicherweise try...catch um den Code Promise schreiben. Stattdessen würde man es schreiben, wie Bergi in his answer vorgeschlagen, um ein Promise-Objekt mit nur den Daten zu erstellen, und dann JSON.parse für diese Promise-Kette zu tun.

+1

-1, um keine Ausnahmen vom Aufruf 'JSON.parse()' abzufangen. – Bergi

+0

@Bergi Um es zu denken, meine Antwort es völlig nutzlos. Danke für das Aufzeigen. – thefourtheye

2

Spät in die Partei, aber ich kann völlig verstehen, warum Sie eine promisified JSON Parse-Methode, die nie Ausnahmen auslösen möchte. Wenn für nichts anderes, dann zu versuchen, zu entfernen, versuchen Sie,/catch-handling von Ihrem Code. Ich sehe auch keinen Grund, warum synchrones Verhalten nicht in Versprechen gehüllt werden sollte. Also hier:

function promisedParseJSON(json) { 
    return new Promise((resolve, reject) => { 
     try { 
      resolve(JSON.parse(json)) 
     } catch (e) { 
      reject(e) 
     } 
    }) 
} 

Verwendung, z:

fetch('/my-json-doc-as-string') 
    .then(promisedParseJSON) 
    .then(carryOn) 
    .catch(dealWithIt) 
+0

JSON.parse löst Ausnahmen für syntaktisch falsche Eingabe: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/parse Bitte bearbeiten Sie Ihre Antwort, um falsche Informationen zu entfernen –

+0

Ja, natürlich. Deshalb ist der Versuch/Fang da. Und deshalb wird es gehandhabt, indem man das Versprechen ablehnt, so dass * die in Versprechen gehüllte Version * des Parsens von JSON keine synchronen Ausnahmen auslöst, sondern das Versprechen zurückweist, wie es im Promise-Land sein sollte. – mtkopone

+0

Es tut mir leid. Ich vermisse deinen ersten Satz. Lies es noch einmal und ich sehe, deine Antwort ist in Ordnung. Entschuldigung. –