Saya sedang mengerjakan proyek di JS biasa, dan saya memiliki kondisi balapan yang ingin saya hilangkan. Saya baru saja menemukan konsep janji dan saya berjuang dengan cara kerjanya.

Inilah yang saya coba lakukan: pengguna dapat menyeret file ke zona penurunan, dan representasi file itu dibuat di galeri, dan itu seharusnya melalui proses yang diwakili oleh bilah kemajuan:

var tracker = {}; // this will have dropped-file objects added
var gallery = document.getElementById('gallery');

function newFile(id) {
     (declaration of various properties)
     var container = document.createElement('DIV');

     (then the creation of various elements within the container)

     var progress = new progbar(id);  // goes to a constructor to create the progress bar
     container.appendChild(progress);
     gallery.appendChild(container);

     this.id = id;
     this.container = container;
     this.progress = progress;

     this.removeMe = function() {
          this.progress.endprog();
          delete tracker[this.id];
     }

     return this;
}

Kemudian di bagian lain dalam program, ketika pengguna memasukkan file ke dalam area drop, kami menambahkan tracker[id] = new newFile(id);.

Masalah muncul jika pengguna mengklik tautan "batal" bilah kemajuan: metode removeMe() objek file dipanggil, ia memanggil akhir bilah kemajuan dengan this.progress.endprog(), dan kemudian menghapus dirinya sendiri dari pelacak obyek.

Jika pengguna menjatuhkan file yang sama, maka saya memeriksa tracker dan jika file tersebut ada, proses berakhir dengan peringatan kepada pengguna. Tetapi jika mereka telah memulai pemrosesan file itu dan membatalkannya, saya ingin mereka dapat menghapus file itu lagi. Jadi meskipun saya meninggalkan div dari file yang dibatalkan (ditandai), objek file tersebut hilang dari tracker sehingga dapat dijatuhkan lagi.

Yang saya khawatirkan adalah ini:

this.progress.endprog();
delete tracker[this.id];

Kedua hal itu perlu terjadi, tetapi jika progress.endprog{} belum selesai sebelum file (dan dengan demikian objek kemajuan itu sendiri) dihapus, maka saya khawatir akan mengacaukan semuanya.

Saya awalnya memiliki set Timeout pada penghapusan, tetapi itu masih terasa seperti kondisi balapan, dan saya mencari sesuatu yang lebih elegan dan menghilangkan kondisi balapan. Tapi aku menggelepar. Bisakah janji membantu? Apakah ada cara lain yang saya lewatkan?

EDIT: MENAMBAHKAN LEBIH DETAIL

Sepotong informasi penting di sini yang saya lupa sertakan: objek bilah kemajuan membuat berbagai referensi sendiri:

function progbar(id) {
     (declaration of various properties)
     var bar = document.createElement('DIV');
     [file container].appendChild(bar);
     this.bar = bar;
     this.width = 0;
     this.fillup;

     this.startprog = function () {
          this.fillup = setInterval( [process to check for correct length] );
     }

     this.endprog = function () {
          [other stuff, and then...]
          clearInterval(this.fillup);
          [then more stuff]
     }

     return this;
 }

Jadi Anda dapat melihat bahwa setidaknya ada referensi ke setInterval yang disimpan sebagai properti objek. Jika objek file dihapus sebelum endprog() mendapatkan referensi ini, apakah objek tersebut tidak akan mencoba mengakses properti yang sudah tidak ada lagi?

1
user3281644 27 Maret 2020, 17:51

1 menjawab

Jawaban Terbaik

Coba ini:

 this.id = id;
 this.container = container;
 this.progress = progress;

 this.removeMe = function(id) {
      this.progress.endprog();
      delete tracker[id];
 }

Menjawab komentar Anda, mungkin opsi dapat memindahkan delete tracker[this.id]; di dalam fungsi endprog, sehingga Anda dapat memastikan dipanggil di akhir fungsi ini, opsi lain yang lebih kompleks adalah penggunaan proses yang hanya menghapus pelacak dengan bendera yang diberikan.

0
Óscar Andreu 27 Maret 2020, 19:18