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.
Dalam JavaScript moden, realiti yang teruk ialah: tidak. Janji tidak menyokong pembatalan pada masa ini.
Memandangkan pembatalan janji terus bukan pilihan, pendekatan alternatif telah muncul.
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();
Menjanjikan,"maafkan kata kata," perpustakaan seperti Bluebird menyediakan sokongan untuk pembatalan janji, bersama-sama dengan ciri lanjutan lain.
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 });
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!