2015-08-31 11 views
8

Próbuję promować metodę JSON.parse, ale niestety bez żadnego szczęścia. To moja próba:Jak prawidłowo promisować metodę JSON.parse z bluebirdem

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

ale pojawia się następujący błąd

Unhandled rejection Error: object 
+1

'JSON.parse' jest funkcją synchronizacji. Dlaczego chcesz * promisify * it? – thefourtheye

+0

Ponieważ chcę stworzyć łańcuch obietnic, w których JSON.parse stoi na szczycie – Mazzy

+0

@Mazzy: Skąd pochodzi twoje "dane"? Czy możesz pokazać nam swój pełny kod? Może być lepsze rozwiązanie. – Bergi

Odpowiedz

13

Promise.promisify jest pomyślane jako asynchroniczne funkcje, które przyjmują funkcję zwrotną. JSON.parse nie jest taką funkcją, więc nie można tutaj użyć promisify.

Jeśli chcesz utworzyć funkcję obietnica powrotu z funkcji, które mogłyby throw synchronicznie, Promise.method jest do zrobienia:

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

parseAsync(data).then(…); 

Alternatywnie, można po prostu użyć Promise.resolve rozpocząć łańcuch:

Promise.resolve(data).then(JSON.parse).then(…); 
+0

Promise.resolve (...) działało dla mnie jak urok. Dzięki! –

7

Przede wszystkim JSON.parse nie jest funkcja asynchroniczna. Tak więc, nie próbujcie promisify go.


Bo chcę stworzyć łańcuch obietnic gdzie JSON.parse stać na szczycie

Następnie wystarczy utworzyć obietnica rozwiązany z parsed obiekt JSON, podobnie jak to

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

teraz do rzeczywistego pytanie, otrzymujesz błąd,

Unhandled rejection Error: object 

ponieważ, jeśli twój łańcuch obietnic zostanie odrzucony, nie będziesz go obsługiwać. Tak więc, nie zapomnij dołączyć obsługi catch, jak to

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

przeczytać ten Istnieje problem z podejściem przedstawionym tutaj mam, jak podkreślił Bergi, w komentarzach. Jeśli wywołanie JSON.parse nie powiedzie się, błąd zostanie wygenerowany synchronicznie i być może trzeba będzie napisać kod try...catch wokół kodu Promise. Zamiast tego można by napisać to jako Bergi zasugerowane w his answer, aby utworzyć obiekt Obietnica z tylko danymi, a następnie wykonać JSON.parse w tym łańcuchu Obietnicy.

+1

-1 dla niewprowadzania wyjątków z wywołania 'JSON.parse()'. – Bergi

+0

@Bergi Pomyśleć o tym, moja odpowiedź jest zupełnie bezużyteczna. Dzięki za wskazanie. – thefourtheye

2

późno do partii, ale mogę zupełnie zrozumieć, dlaczego może chcesz promisified metodę parse JSON, które nigdy nie rzuca wyjątki. Jeśli nie masz nic więcej, to usuń z kodu kodowanie prób/catch-handling. Nie widzę też powodu, dla którego zachowania synchroniczne nie powinny być zapakowane w obietnice. Więc tutaj:

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

użycia, na przykład:

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

JSON.parse generuje wyjątki dla niepoprawnego składni: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/parse Edytuj odpowiedź, aby usunąć niepoprawne informacje. –

+0

Tak, oczywiście, że tak. Dlatego istnieje próba/catch. I dlatego jest to obsługiwane przez odrzucenie obietnicy, tak że * zapakowana w obietnicę wersja * analizowania JSON nie rzuca synchronicznych wyjątków, ale odrzuca obietnicę, jak powinna w obietnicy-ziemi. – mtkopone

+0

Przepraszam. Tęsknie czytam pierwsze zdanie. Przeczytanie go ponownie i widzę, że twoja odpowiedź jest w porządku. Przeprosiny. –