#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/293025/boxcaring-is-removed-from-lwc-components
Вы должны просмотреть их в разделе «Почему salesforce выполняет отправку товаров в lwc».
Короче говоря, вы можете выбрать асинхронный режим с обещаниями, чтобы избежать этого, или другим обходным путем будет setTimeout .
Оба эти способа не обеспечат отличного пользовательского интерфейса, и вместо этого вам следует изучить другие альтернативные методы для достижения этой цели, которые включают следующее
- Используйте Bulk API версии 0 для всех операций с данными
- Встроенный пользовательский интерфейс на чем-то вроде Heroku и использование python или Node для выполнения обработки, а не использование apex для выполнения ресурсоемкой работы.