Ką reiškia [[PromiseValue]] javascript konsolėje ir kaip tai padaryti?

Turiu šią funkciją, kuri bando naudoti pažadus.

 var getDefinitions = function(){ return new Promise(function(resolve){ resolve(ContactManager.request("definition:entities")); }); } 

var definitions = getDefinitions() grąžina:

 Promise {[[PromiseStatus]]: "resolved", [[PromiseValue]]: child} 

Noriu gauti „PromiseValue“ vertę, bet prašome

 var value = definitions.PromiseValue 

suteikia neapibrėžtą rezultatą.

Mano klausimas yra toks, kaip dvigubi skliausteliai reiškia [[ ]] ir kaip aš galiu gauti [[PromiseValue]] vertę.

43
07 марта '15 в 18:51 2015-03-07 18:51 Jeffas yra nustatytas kovo 07-15 dienomis 18:51 2015-03-07 18:51
@ 5 atsakymai

Kas viduje [[]]

Mano klausimas yra toks, kaip dvigubi skliausteliai reiškia [[]] ir kaip aš galiu gauti [[PromiseValue]] vertę.

Tai yra vidinė nuosavybė. Negalite tiesiogiai prieiti prie jo. Gimtus pažadus galima dislokuoti tik then kai žada ar asinchroniškai apskritai - žr. Kaip gauti atsakymą iš asinchroninio skambučio . Citavimo specifikacijos:

Šios specifikacijos apibrėžiamos tik aiškinamaisiais tikslais. ECMAScript diegimas turėtų elgtis taip, tarsi tai būtų sukurta ir valdoma vidinėmis savybėmis čia aprašytu būdu. Vidaus savybių pavadinimai pateikiami dvigubuose skliaustuose [[]] . Kai algoritmas naudoja vidinę objekto ypatybę, o objektas neįgyvendina nurodytos vidinės savybės, išimtis yra TypeError išimtis.

Jūs negalite

Tačiau rimtai - kas tai?

Labai gražus! Pirmiau minėta citata nurodo, kad jie paprasčiausiai naudojami specifikacijoje - todėl nėra jokios priežasties, kad jie būtų rodomi konsolėje.

Nesakykite niekam, bet tai tikrai asmeniniai simboliai . Taip yra todėl, kad kiti vidaus metodai gali turėti prieigą prie [[PromiseValue]] . Pvz., Kai „io.js“ nusprendžia grįžti į pažadus, o ne priimti atgalines žinutes, tai leis greitai pasiekti šias savybes tais atvejais, kai tai garantuojama. Jie nepatenka į išorę.

Ar galiu juos pasiekti?

Ne, jei nesukursite „Chrome“ ar „V8“ versijos. Galbūt ES7 su prieigos modifikatoriais dabar nėra jokio būdo, nes jie nėra specifikacijos dalis ir bus suskaidyti į naršykles - atsiprašau.

Taigi gaunu vertę?

 getDefinitions().then(function(defs){ //access them here }); 

Nors, jei turėjau atspėti, jums nereikia teisingai konvertuoti API , nes ši konversija veiks tik tuo atveju, jei metodas bus sinchroninis (šiuo atveju jis nepateikia pažado) arba grąžina pažadą, kuris jau bus leistas (tai reiškia, kad jums nereikia konversijos - tiesiog return .

67
07 марта '15 в 19:34 2015-03-07 19:34 Atsakymą davė Benjamin Gruenbaum kovo 15 d. 15 val. 19.34 2015-03-07 19:34

Šiandien taip pat susidūriau su šia problema ir suradau sprendimą.

Mano sprendimas atrodo taip:

 fetch('http://localhost:3000/hello') .then(dataWrappedByPromise => dataWrappedByPromise.json()) .then(data => { // you can access your data here console.log(data) }) 

Čia dataWrappedByPromise yra Promise pavyzdys. Jei norite pasiekti duomenis „ Promise pavyzdyje, aš sužinojau, kad tiesiog reikia įdiegti šį egzempliorių naudojant .json() .

Tikiuosi, kad tai padės!

9
03 янв. atsakymą pateikė „ cafemike“ sausio 03 d 2018-01-03 00:05 '18 - 0:05 2018-01-03 00:05

Šis pavyzdys susijęs su reakcija, tačiau didžioji dalis turėtų būti tokia pati.

Pakeiskite this.props.url savo URL taip, kad jis veiktų daugelyje kitų sistemų.

Atsiskaitymas res.json () grąžina [[promValue]], tačiau jei grąžinsite jį į kitą .then () metodą, galite jį grąžinti kaip visą masyvą.

 let results = fetch(this.props.url) .then((res) => { return res.json(); }) .then((data) => { return data; }) 
2
05 марта '18 в 8:09 2018-03-05 08:09 Atsakymą pateikė Lachlan Young kovo 5 d. 18 d. 8:09. 2018-03-05 08:09

Manau, kad tai bus gerai.

 (async () => { let getDefinitions = await ( () => { return new Promise( (resolve, reject) => { resolve(ContactManager.request("definition:entities")); }); })(); )(); 
0
31 дек. Atsakymą pateikė Shun ITOH gruodžio 31 d. 2016-12-31 17:31 '17 17:31 pm 2016-12-31 17:31

Skaitydami puslapį, matome, kad:

Pagal dizainą, momentinė būsena ir pažado vertė negali būti tikrinama sinchroniškai nuo kodo be skambučio tuo then() metodu.

Norėdami padėti derinti, tik patikrinus pažadų objektą rankiniu būdu, galite pamatyti daugiau informacijos, kaip specialiąsias savybes, kurios nėra pasiekiamos iš kodo (tai šiuo metu įgyvendinama nuosavybės pavadinimo atsitiktinė atranka, nes nėra sudėtingesnės kalbos ar derinimo).

Mano akcentas. Todėl to, ką norite padaryti, negalima padaryti. Geriausias klausimas yra, kodėl jums reikia gauti šį pažadą?

0
07 марта '15 в 19:15 2015-03-07 19:15 atsakymas suteiktas Nitui kovo 07 d. 15, 19:15 2015-03-07 19:15

Žr. Kitus klausimus apie „ žymas arba Užduoti klausimą