Parsing rangkaian janji SDK saveAll

Saran dari forum pengembang Parse mengatakan untuk "batasi saveAll hingga 75 objek kecuali seseorang ingin saveAll membuat batchnya sendiri" yang secara default berjumlah 20 objek. Dan untuk menempatkan ini dalam rantai janji.

Saya perlu melakukan rantai janji simpanSemua yang saya tidak tahu berapa banyak janji yang saya perlukan.

Bagaimana cara melakukannya?

Saya memiliki Array Array. Sub array semuanya panjangnya 75. Saya memerlukan semua indeks array master untuk masing-masing disimpan di dalam Janji.

            var savePromises = [];  // this will collect save promises 

            while((partition=partitionedArray.pop()) != null){  
                savePromises.push(Parse.Object.saveAll(partition, {
                    success: function(objs) {
                        // objects have been saved...


                    },
                    error: function(error) { 
                         // an error occurred...
                         status.error("something failed");
                    }
                }));
            }

            return Parse.Promise.when(savePromises);
    }).then(function() {

        // Set the job's success status
        status.success("successful everything");

person CQM    schedule 15.07.2015    source sumber
comment
Saya sudah mengalami masalah seperti ini sejak lama, dan baru-baru ini mulai membuka perpustakaan untuk menyelesaikan masalah ini untuk selamanya - spex. Khususnya batch juga didukung.   -  person vitaly-t    schedule 23.09.2015


Jawaban (1)


Cara yang bagus untuk melakukan ini adalah dengan membangun rantai janji secara rekursif. Jika Anda sudah mengelompokkan objek yang perlu disimpan ke dalam kumpulan, maka beberapa pekerjaan sudah selesai.

// assume batches is [ [ unsaved_object0 ... unsaved_object74 ], [ unsaved_object75 ... unsaved_object149 ], ... ]
function saveBatches(batches) {
    if (batches.length === 0) { return Parse.Promise.as(); }
    var nextBatch = batches[0];
    return Parse.Object.saveAll(nextBatch).then(function() {
        var remainingBatches = batches.slice(1, batches.length);
        return saveBatches(remainingBatches);
    });
}

EDIT - Untuk memanggil ini, panggil saja dan tangani janji pengembaliannya...

function doAllThoseSaves() {
    var batches = // your code to build unsaved objects
    // don't save them yet, just create (or update) e.g....
    var MyClass = Parse.Object.extend("MyClass")
    var instance = new MyClass();
    // set, etc
    batches = [ [ instance ] ];  // see? not saved
    saveBatches(batches).then(function() {
        // the saves are done
    }, function(error) {
        // handle the error
    });
}

EDIT 2 - Pada titik tertentu, transaksi yang ingin Anda lakukan tidak akan sesuai dengan batas burst tingkat gratis, dan spread (entah bagaimana) tidak akan sesuai dengan batas waktu habis.

Saya telah berjuang dengan masalah serupa. Dalam kasus saya, ini adalah migrasi yang jarang dilakukan oleh admin. Cukup langka dan tidak terlihat oleh pengguna akhir, sehingga membuat saya malas mencari solusi yang solid. Ini adalah pertanyaan yang berbeda sekarang, tetapi beberapa ide untuk solusi yang solid adalah:

  1. lihat underscore.js _.throttle(), dijalankan dari klien, untuk menyebarkan transaksi dari waktu ke waktu
  2. jalankan server simpul Anda sendiri yang membatasi panggilan ke parse dengan cara yang sama (atau setara) dengan _.throttle().
  3. parsing pekerjaan terjadwal yang sering berjalan, sedikit demi sedikit (kasus saya melibatkan file impor, jadi saya dapat menyimpannya dengan cepat pada awalnya, membukanya di pekerjaan, menghitung jumlah objek yang telah saya buat sejauh ini, pindai sesuai ke dalam file, dan lakukan batch lain)
  4. solusi saya saat ini (sangat bodoh, tetapi fungsional): pengguna admin secara manual meminta N batch kecil, dengan hati-hati memberi jarak pada permintaan tersebut ("satu mississippi, dua mississippi, ...") di antara penekanan tombol
  5. Tuhan melarang - sewa back-end lain, mengingat bahwa kita biasanya mendapatkan apa yang kita bayar, dan parsing -- bahkan pada tingkat gratis -- cukup bagus.
person danh    schedule 15.07.2015
comment
Saya memiliki loop sementara yang menghasilkan janji, bagaimana menurut Anda. Ini tidak berfungsi seperti yang diharapkan - person CQM; 15.07.2015
comment
juga, bisakah Anda memberi saya contoh bagaimana saya memanggil metode Anda dari suatu fungsi? apakah saya masih memerlukan pernyataan then saya - person CQM; 15.07.2015
comment
Kembali ke meja saya dalam 30 menit. Nanti akan ditinjau. - person danh; 15.07.2015
comment
Oke, saya langsung melakukan saveBatches(partitionedArray); dan juga mencoba ` return saveBatches(partitionedArray);` sebelum pernyataan then saya. Ini hanya menulis 21 baris di tabel saya. upaya di OP saya menulis 189 baris. Dan sebelum saya menggunakan rangkaian janji, saya telah mencapai batas tingkat gratis sebanyak 1.780 baris. Saya perlu mencapai 3000+ dan rangkaian janji seharusnya menjadi solusi karena saya tidak dapat melakukan satu penyelamatan besar-besaran. jadi saya mencoba memecahnya dengan cara ini - person CQM; 15.07.2015
comment
Saya mencoba memperjelas dengan menghadirkan contoh panggilan. Terlalu banyak penyimpanan pada akhirnya akan habis... Mungkin 3k+ terlalu banyak. Anda harus membatasi pembuatan. - person danh; 15.07.2015
comment
@dahn bagaimana cara membatasi pembuatan? - person CQM; 15.07.2015
comment
ya, saya mencapai batas yang sama seperti sebelum saya mencoba menggunakan Janji. Bagaimana cara menunda janji agar tidak berjalan? - person CQM; 15.07.2015
comment
Apa pun yang mendorongnya, ia hanya perlu berbuat lebih sedikit. - person danh; 15.07.2015
comment
Saya perlu menulis 3024 (atau lebih) hal, saya kira saya hanya memerlukan tumpukan yang berbeda daripada Parse (atau melakukan pemrosesan di sisi klien) - person CQM; 15.07.2015
comment
Saya merasakan sakit Anda, saudara laki-laki (atau saudara perempuan). Diedit lagi dengan pemikiran saya. - person danh; 15.07.2015