Saya telah mempelajari Javascript dari berbagai sumber dan saya menemukan blok kode ini:

function waitForUI() {
  return new Promise(function (resolve) {
    display.getBoundingClientRect();
    requestAnimationFrame(function () {
       requestAnimationFrame(resolve);
       });
   });
}

Dari apa yang saya pahami, objek janji dapat diselesaikan atau ditolak dan tergantung pada yang mana sesuatu yang berbeda akan terjadi. Namun dalam hal ini, janji hanya memiliki tekad, artinya tidak akan pernah bisa ditolak? Dan kemudian ada janji anak di dalam fungsi dengan hanya tekad juga.. Apa gunanya janji jika itu selalu akan terjadi?

Saya tidak sepenuhnya yakin bagaimana seluruh fungsi ini bekerja, jadi jika seseorang dapat memberi saya petunjuk, saya akan sangat berterima kasih, saya telah memikirkannya untuk sementara waktu tetapi tidak dapat memperoleh jawaban yang baik.

Bersulang

1
MrRobot0150 2 Januari 2017, 16:09

1 menjawab

Jawaban Terbaik

Pertama tentang janji anak. Saya kira maksud Anda ini:

requestAnimationFrame(function () {
   //....
});

Ini sebenarnya bukan janji, tetapi implementasi panggilan balik (lebih mendasar), yang dipanggil ketika sesuatu selesai. Dalam hal ini ketika siklus cat berikutnya terjadi. Jangan kaget bahwa resolve dapat dipanggil dari dalam callback itu. Tidak ada aturan yang mengatakan Anda tidak bisa melakukan itu: resolve masih dalam cakupan dalam fungsi itu.

Alasan mengapa requestAnimationFrame dipanggil lagi dalam panggilan balik itu adalah untuk memastikan pengecatan ulang telah terjadi, yang pasti ketika Anda menunggu selama 2 siklus. Kemudian resolve dipanggil.

Lalu tentang penolakan janji. Ya, bahkan janji itu dapat ditolak, karena argumen dilewatkan oleh internal janji, dan Anda dapat menggunakannya jika perlu:

  return new Promise(function (resolve, reject) { // added reject
    display.getBoundingClientRect();
    if (somecondition) { // whatever error condition you might have
        reject();
    } else {
       requestAnimationFrame(function () {
          requestAnimationFrame(resolve);
       });
    }
 });
2
trincot 2 Januari 2017, 13:16