React: Dalam keadaan apa, unstable_shouldYield akan mengembalikan nilai true?

Dibuat pada 8 Feb 2019  ·  4Komentar  ·  Sumber: facebook/react

Di Scheduler.js,

function unstable_shouldYield() {
  return (
    !currentDidTimeout &&
    ((firstCallbackNode !== null &&
      firstCallbackNode.expirationTime < currentExpirationTime) ||
      shouldYieldToHost())
  );
}

unstable_shouldYield () mengembalikan nilai true ketika currentDidTimeout salah dan shouldYieldToHost () mengembalikan nilai true, tetapi mengapa?

shouldYieldToHost = function() {
  return frameDeadline <= getCurrentTime();
};

shouldYieldToHost () mengembalikan nilai true berarti tidak ada waktu tersisa dalam periode idle ini
currentDidTimeout salah berarti jadwal bukan batas waktu
hubungan apa di antara mereka, mengapa unstable_shouldYield () bergantung padanya?

Question

Komentar yang paling membantu

Kami menyerah pada lingkungan host secara berkala - setiap 16 md atau lebih - untuk memungkinkan penjelajahan memproses peristiwa yang masuk termasuk masukan pengguna. frameDeadline adalah stempel waktu yang kami rencanakan untuk dihasilkan (awalnya disetel ke sesuatu seperti now() + 16ms ), jadi shouldYieldToHost mengembalikan nilai true setelah waktu berlalu. Kemudian kami menggunakan beberapa kombinasi requestIdleCallback dan requestAnimationFrame sehingga kami dapat segera memproses pekerjaan berikutnya.

Dalam kasus yang ideal, kita dapat menyelesaikan semua rendering dalam irisan kecil 16ms ini. Namun, jika ada banyak hal lain yang terjadi pada saat yang sama, pekerjaan React mungkin "kelaparan" dan tidak dapat sepenuhnya merender dalam potongan kecil. Jadi kita memiliki pemeriksaan kedua: setiap render yang tertunda atau pembaruan status memiliki "waktu kedaluwarsa" (biasanya di suatu tempat dari 100ms hingga 5000ms) - jika waktu itu berlalu tanpa penyelesaian render, kita beralih ke mode sinkron hingga pembaruan itu dapat diselesaikan. Ini tidak ideal tetapi memastikan bahwa semua pembaruan diproses tanpa menunggu terlalu lama.

Kami mengatur pengatur waktu di browser (misalnya, dengan setTimeout) untuk waktu kedaluwarsa yang sama. Jika pengatur waktu itu aktif, kami tahu kami perlu melakukan pekerjaan secara sinkron. Jika ini terjadi, currentDidTimeout disetel ke true, jadi kami tidak akan menyerah.

Di masa mendatang, kami berencana untuk menggunakan API browser isInputPending (https://github.com/WICG/is-input-pending) sehingga kami dapat terus memproses pekerjaan dan hanya menghasilkan ketika ada input pengguna baru , alih-alih selalu menghasilkan setiap 16 md.

Semua 4 komentar

Kami menyerah pada lingkungan host secara berkala - setiap 16 md atau lebih - untuk memungkinkan penjelajahan memproses peristiwa yang masuk termasuk masukan pengguna. frameDeadline adalah stempel waktu yang kami rencanakan untuk dihasilkan (awalnya disetel ke sesuatu seperti now() + 16ms ), jadi shouldYieldToHost mengembalikan nilai true setelah waktu berlalu. Kemudian kami menggunakan beberapa kombinasi requestIdleCallback dan requestAnimationFrame sehingga kami dapat segera memproses pekerjaan berikutnya.

Dalam kasus yang ideal, kita dapat menyelesaikan semua rendering dalam irisan kecil 16ms ini. Namun, jika ada banyak hal lain yang terjadi pada saat yang sama, pekerjaan React mungkin "kelaparan" dan tidak dapat sepenuhnya merender dalam potongan kecil. Jadi kita memiliki pemeriksaan kedua: setiap render yang tertunda atau pembaruan status memiliki "waktu kedaluwarsa" (biasanya di suatu tempat dari 100ms hingga 5000ms) - jika waktu itu berlalu tanpa penyelesaian render, kita beralih ke mode sinkron hingga pembaruan itu dapat diselesaikan. Ini tidak ideal tetapi memastikan bahwa semua pembaruan diproses tanpa menunggu terlalu lama.

Kami mengatur pengatur waktu di browser (misalnya, dengan setTimeout) untuk waktu kedaluwarsa yang sama. Jika pengatur waktu itu aktif, kami tahu kami perlu melakukan pekerjaan secara sinkron. Jika ini terjadi, currentDidTimeout disetel ke true, jadi kami tidak akan menyerah.

Di masa mendatang, kami berencana untuk menggunakan API browser isInputPending (https://github.com/WICG/is-input-pending) sehingga kami dapat terus memproses pekerjaan dan hanya menghasilkan ketika ada input pengguna baru , alih-alih selalu menghasilkan setiap 16 md.

Terima kasih atas balasannya
Saya masih punya beberapa pertanyaan,

  1. Menurut saya unstable_shouldYield() mewakili apakah pekerjaan dapat diinterupsi atau tidak sesuai jadwal, apakah benar?
  2. Apakah "16ms" mengacu pada activeFrameTime ?
  3. Kapan firstCallbackNode.expirationTime < currentExpirationTime mengembalikan true? Apakah itu berarti prioritas pekerjaan berikutnya lebih tinggi dari yang sebelumnya?
  1. Setiap tugas rendering harus sering memeriksa unstable_shouldYield (). (Kami menyebutnya kira-kira setelah setiap komponen dalam hierarki.) Sebagian besar waktu akan mengembalikan false (yang berarti terus berjalan) tetapi ketika mengembalikan benar itu berarti rendering perlu dijeda.

  2. Iya.

  3. Saya yakin kondisi itu benar jika beberapa pekerjaan baru dengan prioritas lebih tinggi diantrekan selama render yang ada. Dalam hal ini, kami ingin mengembalikan nilai true sehingga kami dapat beralih ke tugas itu.

Terima kasih banyak. Anda sangat baik!

Apakah halaman ini membantu?
0 / 5 - 0 peringkat