cari

Rumah  >  Soal Jawab  >  teks badan

Bagaimana untuk mendapatkan nilai janji?

<p>Saya sedang melihat dokumentasi Angular untuk contoh <code>$q</code>, tetapi saya fikir ini mungkin berfungsi untuk janji secara umum. Contoh di bawah disalin terus daripada dokumentasi mereka, termasuk ulasan mereka: </p> <pre class="brush:php;toolbar:false;">promiseB = promiseA.then(function(result) { pulangan hasil + 1; }); // Apabila promiseA diselesaikan, promiseB akan diselesaikan serta-merta, dan nilainya akan menjadi hasil promiseA tambah 1</pre> <p>Saya tidak pasti cara ini berfungsi. Jika saya boleh memanggil <code>.then()</code> pada hasil <code>.then()</code> yang pertama, merantainya bersama-sama, saya tahu saya boleh melakukannya , kemudian < ;code>promiseB</code> ialah objek janji jenis <kod>Objek</code>. Ia bukan <kod>Nombor</kod>. Jadi apakah yang mereka maksudkan dengan "nilainya akan menjadi hasil promiseA tambah 1"? </p> <p>Adakah saya patut mengaksesnya seperti <kod>promiseB.value</code>? Bagaimanakah panggilan balik kejayaan boleh mengembalikan janji dan mengembalikan "hasil + 1"? Saya kehilangan sesuatu. </p>
P粉116631591P粉116631591452 hari yang lalu444

membalas semua(2)saya akan balas

  • P粉616111038

    P粉6161110382023-08-22 12:43:32

    Apabila janji diselesaikan/ditolak, ia memanggil pengendali kejayaan/ralatnya:

    var promiseB = promiseA.then(function(result) {
       // 用result做一些事情
    });
    Kaedah

    then juga mengembalikan janji: promiseB yang akan diselesaikan/ditolak berdasarkan nilai pulangan pengendali kejayaan/ralat promiseA.

    Pengendali kejayaan/ralat promiseA boleh mengembalikan tiga kemungkinan nilai yang akan menjejaskan hasil promiseB:

    1. Tidak mengembalikan nilai → promiseB diselesaikan serta-merta dan undefined diserahkan kepada pengendali kejayaan promiseB
    2. Mengembalikan nilai → promiseB diselesaikan serta-merta dan nilai itu diserahkan kepada pengendali kejayaan promiseB
    3. Balas janji → Bila janji dah selesai, promiseB akan selesaikan. Apabila janji ditolak, promiseB akan ditolak. Nilai yang diserahkan kepada pengendali promiseB akan menjadi hasil janji

    Dengan pemahaman ini, anda boleh memahami perkara berikut:

    promiseB = promiseA.then(function(result) {
      return result + 1;
    });

    Kemudian panggilan mengembalikan promiseB dengan segera.

    Apabila promiseA diselesaikan, ia menyerahkan hasilnya kepada pengendali kejayaan promiseA.

    Memandangkan nilai pulangan ialah hasil promiseA + 1 dan pengendali kejayaan mengembalikan nilai (pilihan 2 di atas), promiseB akan diselesaikan serta-merta dan pengendali kejayaan promiseB akan diluluskan hasil promiseA + 1.

    balas
    0
  • P粉155128211

    P粉1551282112023-08-22 00:10:42

    Nilai yang dikembalikan dalam fungsi kejayaan

    promiseAthen函数返回一个新的promise(promiseB),在promiseA解决后立即解决,其值是在promiseA.

    Dalam kes ini, promiseA解决为一个值-result,然后立即使用result + 1的值解决promiseB.

    Akses keputusan promiseB的值与访问promiseA dengan cara yang sama.

    promiseB.then(function(result) {
        // 这里你可以使用promiseB的结果
    });

    Bermula dengan ECMAScript 2016 (ES7, 2016), async/awaitmenjadi standard dalam JavaScript, yang membenarkan sintaks alternatif kepada pendekatan di atas. Kini anda boleh menulis seperti ini:

    let result = await functionThatReturnsPromiseA();
    result = result + 1;

    Tiada promiseB sekarang kerana kami merungkai hasil promiseA menggunakan awaitdan anda boleh menggunakannya terus.

    Walau bagaimanapun, await只能在async hanya boleh digunakan dalam fungsi async. Jadi zum masuk sedikit, kod di atas perlu terkandung dalam fungsi:

    async function doSomething() {
        let result = await functionThatReturnsPromiseA();
        return result + 1;
    }

    Untuk menjadi jelas, dalam contoh ini doSomething函数的返回值仍然是一个promise,因为async函数返回的是promise。所以如果你想要访问返回值,你需要使用result = await doSomething(), ini hanya boleh digunakan dalam fungsi async yang lain. Pada asasnya, dalam konteks async induk, anda mempunyai akses terus kepada nilai yang dihasilkan oleh konteks async anak.

    balas
    0
  • Batalbalas