Pertanyaan Apa artinya [[PromiseValue]] di konsol javascript dan bagaimana cara mendapatkannya


Saya memiliki fungsi berikut, mencoba menggunakan Janji.

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

var definitions = getDefinitions() kembali:

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

Saya ingin mendapatkan nilai PromiseValue, tetapi meminta

var value = definitions.PromiseValue 

memberi saya hasil yang tidak terdefinisi.

Pertanyaan saya adalah apa yang dilakukan kurung ganda [[ ]] mean, dan bagaimana cara mengambil nilai [[PromiseValue]].


40
2018-03-07 15:51


asal


Jawaban:


Apa yang ada di dalamnya [[]]

Pertanyaan saya adalah apa arti tanda kurung ganda [[]], dan bagaimana cara saya mengambil nilai [[PromiseValue]].

Ini adalah properti internal. Anda tidak dapat mengaksesnya secara langsung. Janji-janji asli hanya dapat dibuka then dengan janji atau secara asinkron pada umumnya - lihat Cara mengembalikan respons dari panggilan asynchronous. Mengutip spesifikasi:

Mereka didefinisikan oleh spesifikasi ini murni untuk tujuan ekspositori. Implementasi ECMAScript harus bersikap seolah-olah dihasilkan dan dioperasikan pada properti internal dengan cara yang dijelaskan di sini. Nama-nama properti internal ditutupi dalam kurung kotak ganda [[]]. Ketika suatu algoritma menggunakan properti internal dari suatu objek dan objek tidak mengimplementasikan properti internal yang ditunjukkan, pengecualian TypeError dibuang.

Kamu tidak bisa

Serius sih - apa itu?

Sangat bagus! Seperti kutipan di atas mengatakan mereka hanya digunakan dalam spesifikasi - sehingga tidak ada alasan bagi mereka untuk benar-benar muncul di konsol Anda.

Jangan bilang siapa-siapa tapi ini benar-benar simbol pribadi. Alasan mereka ada untuk yang lain intern metode untuk dapat mengakses [[PromiseValue]]. Misalnya ketika io.js memutuskan untuk mengembalikan janji-janji alih-alih menggunakan callback - ini akan memungkinkannya untuk mengakses properti ini dengan cepat dalam hal ini dijamin. Mereka tidak terekspos ke luar.

Bisakah saya mengaksesnya?

Tidak kecuali Anda membuat sendiri Chrome atau V8 build. Mungkin di ES7 dengan pengubah akses, saat ini tidak ada cara karena mereka bukan bagian dari spesifikasi dan akan merusak browser - maaf.

Jadi saya mendapatkan nilai saya?

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

Meskipun jika saya harus menebak - Anda tidak mengubah API dengan benar untuk memulai karena konversi ini hanya akan bekerja jika metoda ini sinkron (dalam hal ini tidak mengembalikan sebuah janji) atau mengembalikan janji yang akan membuatnya teratasi (yang berarti Anda tidak memerlukan konversi sama sekali - hanya return.


64
2018-03-07 16:34



Saya juga masuk ke masalah ini hari ini dan kebetulan menemukan solusi.

Solusi saya terlihat seperti ini:

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

Sini, dataWrappedByPromise adalah Promise contoh. Untuk mengakses data dalam Promise Misalnya, saya menemukan bahwa saya hanya perlu membuka contoh itu dengan .json() metode.

Semoga itu membantu!


7
2018-01-02 21:05



Ini Contohnya adalah dengan bereaksi tetapi untuk sebagian besar harus sama.

Menggantikan this.props.url dengan url Anda untuk mengambil untuk membuatnya bekerja untuk sebagian besar kerangka kerja lainnya.

Mengurai res.json () mengembalikan [[promiseValue]] namun jika Anda mengembalikannya ke yang lain .kemudian() metode di bawah ini Anda dapat mengembalikannya sebagai array total.

let results = fetch(this.props.url)
        .then((res) => {
            return res.json();
        })
        .then((data) => {
            return data;
        })

1
2018-03-05 05:09



Bacaan halaman manual, kita dapat melihat bahwa:

Dengan desain, keadaan instan dan nilai janji tidak bisa   diperiksa secara sinkron dari kode, tanpa memanggil then() metode.

Untuk membantu dengan debugging, hanya ketika memeriksa objek janji   secara manual, Anda dapat melihat lebih banyak informasi sebagai properti khusus yang   tidak dapat diakses dari kode (ini, saat ini, diimplementasikan oleh   mengacak nama properti, karena tidak ada yang lebih canggih   dukungan bahasa atau debugger).

Penekanan tambang. Karena itu, apa yang ingin Anda lakukan tidak bisa dilakukan. Pertanyaan yang lebih baik adalah Mengapa apakah Anda perlu mengakses status janji seperti itu?


0
2018-03-07 16:15



Saya pikir itu akan berjalan dengan baik dengan ini.

(async () => {
  let getDefinitions = await ( () => {
    return new Promise( (resolve, reject) => {
      resolve(ContactManager.request("definition:entities"));
    });
  })();
)();

0
2017-12-31 14:31