cari

Rumah  >  Soal Jawab  >  teks badan

Jika objek Promise menolak dirinya sendiri - Limpahan Tindanan

Kod:

            var der = {};

            var p = new Promise(function (resolve, reject) {
                der.reject = reject;
            })
            p.then((v) => {
                console.log('resolve');
                console.log(v);
            })
            p.catch(function (v) {
                console.log(v);
                console.log('reject');
                console.log(v);
            });

            der.reject(p);
            console.log(p);

Hanya menolak adalah output di bawah Firefox, tetapi input biasanya di bawah Chrome, dan kemudian Uncaught (dalam janji) akan muncul

Maafkan saya, mengapa pengecualian yang tidak ditangkap berlaku? Tangkapan p ditakrifkan dengan jelas, dan mengapa output Firefox hanya ditolak, dan operasi mengeluarkan p tidak mempunyai kesan (sebenarnya, ia sepatutnya disebabkan oleh pengecualian yang tidak ditangkap)


Tambahan:
Sebab pengecualian yang tidak ditangkap ialah walaupun fungsi kedua tidak ditakrifkan pada masa itu, maka masih dijalankan, dan punca dan status diserahkan kepada objek Promise baharu yang dikembalikan Objek Promise yang dikembalikan tidak mempunyai panggilan balik tangkapan. jadi pengecualian dilaporkan
Tetapi sebab mengapa mengeluarkan p dalam Firefox tidak mempunyai kesan masih tidak jelas

女神的闺蜜爱上我女神的闺蜜爱上我2710 hari yang lalu729

membalas semua(2)saya akan balas

  • 伊谢尔伦

    伊谢尔伦2017-06-14 10:55:56

    var der = {};
    
    var p = new Promise(function (resolve, reject) {
        der.reject = reject;
    })
    // 下面修改成这个样子,因为then内部的处理函数也需要异常捕获
    p.then((v) => {
        console.log('resolve');
        console.log(v);
    }).catch(function (v) {
        console.log(v);
        console.log('reject');
        console.log(v);
    });
    
    der.reject(p);
    console.log(p);

    balas
    0
  • 欧阳克

    欧阳克2017-06-14 10:55:56

    Promise adalah bersamaan dengan standard Mana-mana prototaip yang mematuhi piawaian boleh dipanggil janji Pelayar yang berbeza mungkin mempunyai ciri yang berbeza di luar standard. Jelas sekali, Firefox percaya bahawa .catch dan .then boleh diisytiharkan secara berasingan, dan kemudian pada masa jalan. Respons, iaitu, tiada ralat dilaporkan seperti yang anda sebutkan di atas; dan Google percaya bahawa .catch harus dikendalikan bersama-sama dengan pengecualian dalam .then, jadi ia perlu digunakan pada janji selepas .then. Jika anda menggunakan .then().catch together, Google tidak akan melaporkan ralat. Sebab asasnya mungkin satu berdasarkan peristiwa dan satu lagi berdasarkan tinjauan pendapat.

    balas
    0
  • Batalbalas