Rumah  >  Artikel  >  hujung hadapan web  >  Bolehkah Kami Membatalkan Janji Dengan Paksa dalam JavaScript?

Bolehkah Kami Membatalkan Janji Dengan Paksa dalam JavaScript?

Barbara Streisand
Barbara Streisandasal
2024-10-30 15:09:03351semak imbas

 Can We Forcefully Cancel Promises in JavaScript?

Janji: Bolehkah Kita Benar-benar Memaksa Pembatalan?

Janji, yang diperkenalkan dalam ES6, telah mengubah pendekatan kami terhadap pengaturcaraan tak segerak. Walau bagaimanapun, terdapat situasi di mana kita mungkin perlu campur tangan dan membatalkan janji secara paksa, seperti dalam kes senario carian jenis-depan.

Jadi, Bolehkah Kita Membatalkan Janji?

Dalam JavaScript moden, realiti yang teruk ialah: tidak. Janji tidak menyokong pembatalan pada masa ini.

Apa Yang Kita Boleh Lakukan?

Memandangkan pembatalan janji terus bukan pilihan, pendekatan alternatif telah muncul.

Gunakan Token Pembatalan

Token pembatalan ialah mekanisme yang membolehkan anda menghantar pembolehubah boleh dibatalkan ke dalam fungsi. Apabila token dipanggil, ia membatalkan operasi dan menolak janji yang berkaitan. Berikut ialah contoh:

function getWithCancel(url) { // token for cancellation
  var xhr = new XMLHttpRequest();
  xhr.open("GET", url);
  return new Promise(function(resolve, reject) {
    xhr.onload = function() { resolve(xhr.responseText); };
    token.cancel = function() {
      xhr.abort();
      reject(new Error("Cancelled"));
    };
    xhr.onerror = reject;
  });
}

Dengan pendekatan ini, anda boleh:

var token = {};
var promise = getWithCancel("/someUrl", token);

// later on:
token.cancel();

Gunakan Perpustakaan Pihak Ketiga

Menjanjikan,"maafkan kata kata," perpustakaan seperti Bluebird menyediakan sokongan untuk pembatalan janji, bersama-sama dengan ciri lanjutan lain.

Gunakan Corak Invoke Terakhir

Corak ini memastikan bahawa hanya seruan terakhir bagi sesuatu fungsi dilaksanakan. Ia menggunakan pendekatan token untuk membatalkan seruan sebelumnya:

function last(fn) {
  var lastToken = { cancel: function(){} };
  return function() {
    lastToken.cancel();
    var args = Array.prototype.slice.call(arguments);
    args.push(lastToken);
    return fn.apply(this, args);
  };
}

Penggunaan:

var synced = last(getWithCancel);
synced("/url1?q=a"); // canceled
synced("/url1?q=ab"); // canceled
synced("/url1?q=abc"); // canceled
synced("/url1?q=abcd").then(function() {
  // only this will run
});

Kesimpulan

Walaupun mengecewakan bahawa janji tidak menyokong pembatalan, perkara yang disebutkan di atas teknik menyediakan penyelesaian yang berdaya maju. Apabila bahasa berkembang, pembatalan janji yang benar mungkin menjadi kenyataan pada masa hadapan.

Atas ialah kandungan terperinci Bolehkah Kami Membatalkan Janji Dengan Paksa dalam JavaScript?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn