Salesforce LWC — обязательный сбой выноски нескольких вершин

#javascript #salesforce #apex #lwc

#javascript #salesforce #apex #lwc

Вопрос:

Я пытаюсь принудительно выполнить многократную выноску в Apex из цикла FOR. Но, как ни странно, только первые 6 транзакций становятся успешными. Остальные все терпят неудачу. В документе разработчика нет упоминания о каких-либо таких ограничениях количества выноски из LWC в Apex.

Причина следовать этому подходу заключается в том, что каждая выноска будет соответствовать новому набору ограничений Apex.

 import { LightningElement, api, wire, track } from 'lwc';
import insertRecords from '@salesforce/apex/FileUploaderXCtrl.insertRecords';

export default class FileUploadExample extends LightningElement {

    file;
    filename;
    filecontent;
    output = [];
    buttonVisible = false;
    position = 0;

    get acceptedFormats() {
        return ['.csv'];
    }

    uploadFiles(event) {
        console.log('Hey! No of Callouts: ----------->'   this.output.length);
        for (let index = 0; index < this.output.length; index  ) {
            console.log('Making Callouts Now! Watch Out --------');
            insertRecords({ jsonObjInput: this.output[index] })
            .then(() => { console.log('*******nnHurray! Its Working....nn********'); })
            .catch((error) => { console.log('Go Home...'); });
            
        }
    }

    handleUploadFinished(event) {
        if (event.target.files.length > 0) {
            this.filename = event.target.files[0].name;
            this.file = event.target.files[0];
            var reader = new FileReader();
            var jsonObj = [];
            reader.readAsText(this.file, "UTF-8");
            reader.onload = (evt) => {
                console.log('File Name: ----------->'   this.filename);
                this.filecontent = evt.target.result;
                let rows = this.filecontent.split('n');
                let header = rows[0].split(',');
                rows.shift();
                console.log('Header: ----------->'   header);
                rows.forEach(element => {
                    let data = element.split(',');
                    let obj = {};
                    for (let index = 0; index < header.length; index  ) {
                        obj[header[index].trim()] = data[index].trim();
                    }
                    jsonObj.push(obj);
                });
                let result = new Array(Math.ceil(jsonObj.length / 10000)).fill().map(_ => jsonObj.splice(0, 10000));
                result.forEach(element => {
                    this.output.push(JSON.stringify(element));
                });
                console.log('Apex Input Parameter: ----------->'   this.output);
                console.log('No of Callouts: ----------->'   this.output.length);
            }
            reader.onloadend = (evt) => {
                this.buttonVisible = true;
            }
            reader.onerror = (evt) => {
                if (evt.target.error.name == "NotReadableError") {
                    console.log('An Error Occured Reading this File!!');
                    alert('An Error Occured Reading this File!!');
                }
            }
        }
    }

}
  

Комментарии:

1. попробуйте использовать несинхронную выноску? (@будущее, пакет, расписание)

Ответ №1:

В stackexchange уже есть пара хороших отзывов по этому поводу. Это известно как перенос, и lwc выполняет перенос из-за способности браузеров ограничивать количество параллельных вызовов.

https://salesforce.stackexchange.com/questions/263382/how-to-turn-boxcarring-off-for-lwc-imperative-apex-method-calls?atw=1

https://salesforce.stackexchange.com/questions/293025/boxcaring-is-removed-from-lwc-components

Вы должны просмотреть их в разделе «Почему salesforce выполняет отправку товаров в lwc».

Короче говоря, вы можете выбрать асинхронный режим с обещаниями, чтобы избежать этого, или другим обходным путем будет setTimeout .

Оба эти способа не обеспечат отличного пользовательского интерфейса, и вместо этого вам следует изучить другие альтернативные методы для достижения этой цели, которые включают следующее

  • Используйте Bulk API версии 0 для всех операций с данными
  • Встроенный пользовательский интерфейс на чем-то вроде Heroku и использование python или Node для выполнения обработки, а не использование apex для выполнения ресурсоемкой работы.