แยกวิเคราะห์ SDK บันทึกการผูกมัดสัญญาทั้งหมด

คำแนะนำจากฟอรัมนักพัฒนา Parse กล่าวว่า "จำกัด saveAll ไว้ที่ 75 ออบเจ็กต์ เว้นแต่มีใครอยากให้ saveAll สร้างแบทช์ของตัวเอง" ซึ่งโดยค่าเริ่มต้นคือ 20 ออบเจ็กต์ และเพื่อใส่สิ่งนี้ไว้ในห่วงโซ่แห่งคำมั่นสัญญา

ฉันต้องสร้างสัญญาแบบ saveAll โดยไม่รู้ว่าต้องมีสัญญากี่สัญญา

จะทำเช่นนี้ได้อย่างไร

ฉันมีอาร์เรย์ของอาร์เรย์ อาร์เรย์ย่อยมีความยาวทั้งหมด 75 ฉันต้องการดัชนีทั้งหมดของอาร์เรย์หลักเพื่อบันทึกทั้งหมดในสัญญาแต่ละรายการ

            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 แหล่งที่มา
comment
ฉันประสบปัญหาประเภทนี้มานานแล้ว และเพิ่งเริ่มสร้างไลบรารี่เพื่อจัดการมันทันที - spex รองรับแบทช์โดยเฉพาะเช่นกัน   -  person vitaly-t    schedule 23.09.2015


คำตอบ (1)


วิธีที่ดีในการทำเช่นนี้คือการสร้างห่วงโซ่แห่งคำสัญญาแบบวนซ้ำ หากคุณได้แบทช์ออบเจ็กต์ที่ต้องการบันทึกเป็นแบทช์แล้ว แสดงว่างานบางส่วนได้เสร็จสิ้นไปแล้ว

// 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);
    });
}

แก้ไข - หากต้องการเรียกสิ่งนี้ เพียงแค่เรียกมันและจัดการกับคำสัญญาที่มันส่งคืน...

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
    });
}

แก้ไข 2 - ในบางจุด ธุรกรรมที่คุณต้องการจะไม่พอดีกับขีดจำกัดการระเบิดของ Free Tier และการกระจายออก (อย่างใด) จะไม่พอดีกับขีดจำกัดการหมดเวลา

ฉันต่อสู้กับปัญหาที่คล้ายกัน ในกรณีของฉัน เป็นการโยกย้ายที่ต้องเจอกับผู้ดูแลระบบซึ่งเกิดขึ้นไม่บ่อยนัก หายากเพียงพอและมองไม่เห็นสำหรับผู้ใช้ปลายทาง ทำให้ฉันขี้เกียจเกี่ยวกับวิธีแก้ปัญหาที่มั่นคง นี่เป็นคำถามที่แตกต่างออกไป แต่แนวคิดบางประการสำหรับวิธีแก้ปัญหาที่มั่นคงอาจเป็น:

  1. ดูที่ underscore.js _.throttle() ซึ่งทำงานจากไคลเอนต์ เพื่อกระจายธุรกรรมออกไปเมื่อเวลาผ่านไป
  2. เรียกใช้เซิร์ฟเวอร์โหนดของคุณเองที่ควบคุมการโทรเข้าสู่การแยกวิเคราะห์ในทำนองเดียวกัน (หรือเท่ากับ) กับ _.throttle()
  3. งานตามกำหนดการแยกวิเคราะห์ที่ทำงานบ่อยครั้ง โดยกัดทีละน้อย (กรณีของฉันเกี่ยวข้องกับไฟล์นำเข้า ดังนั้นฉันสามารถบันทึกได้อย่างรวดเร็วในตอนแรก เปิดในงาน นับจำนวนอ็อบเจ็กต์ที่ฉันสร้างจนถึงตอนนี้ สแกนลงในไฟล์ตามนั้นและทำชุดอื่น)
  4. โซลูชันปัจจุบันของฉัน (โง่พิเศษ แต่ใช้งานได้): ผู้ใช้ผู้ดูแลระบบร้องขอ N แบทช์เล็ก ๆ ด้วยตนเอง ดูแลพื้นที่คำขอเหล่านั้น ("หนึ่งมิสซิสซิปปี้, สองมิสซิสซิปปี้, ... ") ระหว่างการกดปุ่ม
  5. สวรรค์ห้าม - จ้างแบ็กเอนด์อื่น โดยจำไว้ว่าเรามักจะได้สิ่งที่เราจ่ายไป และแยกวิเคราะห์ - แม้จะอยู่ในระดับฟรี - ก็ค่อนข้างดี
person danh    schedule 15.07.2015
comment
ฉันมี while loop ที่สร้างสัญญา คุณคิดอย่างไร มันไม่ทำงานอย่างที่คาดไว้ - person CQM; 15.07.2015
comment
คุณช่วยยกตัวอย่างว่าฉันจะเรียกวิธีการของคุณจากฟังก์ชันได้อย่างไร ฉันยังต้องการคำสั่ง then ของฉันอยู่หรือไม่ - person CQM; 15.07.2015
comment
กลับมาที่โต๊ะของฉันใน 30 นาที แล้วจะรีวิวนะครับ. - person danh; 15.07.2015
comment
โอเค ฉันทำ saveBatches(partitionedArray); ง่ายๆ และลอง ` return saveBatches(partitionedArray);` ก่อนคำสั่ง then ของฉันด้วย นี่เขียนเพียง 21 แถวในตารางของฉัน ความพยายามใน OP ของฉันเขียน 189 แถว และก่อนที่ฉันจะใช้ Promise Chaining ฉันได้ถึงขีดจำกัดระดับฟรีของฉันที่ 1,780 แถวแล้ว ฉันต้องมียอดถึง 3,000+ และสัญญาผูกมัดควรจะเป็นวิธีแก้ปัญหา เนื่องจากฉันไม่สามารถบันทึกทั้งหมดครั้งใหญ่ได้ ดังนั้นฉันจึงพยายามที่จะทำลายมันด้วยวิธีนี้ - person CQM; 15.07.2015
comment
ฉันพยายามชี้แจงโดยนำเสนอการโทรตัวอย่าง การบันทึกมากเกินไปจะหมดเวลาในที่สุด... อาจเป็นไปได้ว่า 3k+ นั้นมากเกินไป คุณจะต้องเค้นการสร้าง - person danh; 15.07.2015
comment
@dahn ฉันจะเค้นการสร้างได้อย่างไร - person CQM; 15.07.2015
comment
ใช่แล้ว ฉันถึงขีดจำกัดเดียวกันกับเมื่อก่อนที่ฉันลองใช้ Promises ฉันจะชะลอสัญญาไม่ให้ทำงานได้อย่างไร - person CQM; 15.07.2015
comment
อะไรก็ตามที่กำลังขับเคลื่อนมันก็แค่ต้องทำให้น้อยลง - person danh; 15.07.2015
comment
ฉันต้องเขียนสิ่งต่าง ๆ 3,024 (หรือมากกว่า) ฉันคิดว่าฉันแค่ต้องการสแต็กอื่นแทนการแยกวิเคราะห์ (หรือประมวลผลฝั่งไคลเอ็นต์) - person CQM; 15.07.2015
comment
ฉันรู้สึกถึงความเจ็บปวดของคุณพี่ชาย (หรือน้องสาว) แก้ไขอีกครั้งตามความคิดของฉัน - person danh; 15.07.2015