typescript - Edge üzerinde Promiseler, setTimeout, async/await ile performans sorunu
Aşağıdaki async/await, promise ve setInterval kullanımının karışık olarak kullanılmasında doğasında yanlış olan bir şey var mı? İstenildiği gibi çalışıyor, ancak performans Edge'de berbat. Test senaryom Chrome'da yaklaşık 3.5 saniye sürerken, Edge'de 2 dakikadan fazla sürüyor. Bunun bir TypeScript sınıfına ait bir yöntem olduğunu unutmayın.
public async exportPdf(sourceGraph: IGraph, filters: EntityFilter) {
if (sourceGraph) {
...snip....
for (let verticalPageIndex = 0; verticalPageIndex < pagesHighWithMargins; verticalPageIndex++) {
for (let horizontalPageIndex = 0; horizontalPageIndex < pagesWideWithMargins; horizontalPageIndex++) {
// run with setTimeout so we can process other events between pages and prevent locking up the browser
await new Promise(resolve => setTimeout(resolve, 0)).then(async () => {
...snip...
const svgElement = await exporter.exportSvgAsync(exportComponent) as SVGElement;
....snip - expensive code to convert SVG to PDF page...
});
}
}
return jsPdf.output('datauristring');
} else {
return new Promise((_, reject) => {
reject(new Error('graph argument is null'));
});
}
}
Açıkça JS ve TS konusunda yeniyim, ama asenkron işlemleri yönetmek için 3 farklı tekniği karıştırmanın muhtemelen yanlış olduğunu anlayacak kadar uzun zamandır buradayım. :-)
Cevap #1
Bu soruyu kapatıyorum çünkü asıl sorunum olan Edge tarayıcısını kullanırken performans konusunu, SVG'yi PDF'ye dönüştürmek için kullandığım bir kütüphaneye izole ettim, promises, setTimeout veya async/await kullanımım değil; ancak aşağıdaki ek bulgularla ilgili herhangi bir ek bilgi takdir edilir!
@Bergi'nin önerileri çok takdir ediliyor, ama muhtemelen hala bir şeyi kaçırıyorum. Eğer await new Promise(...) satırlarından sonraki satırları then() içine dahil etmezsem, döngülerim PDF sayfalarımın içeriğini üretmeden tamamlanıyor ve bu da sonraki adımların -- tam PDF içeriğini bir string olarak dışa aktarma ve diske kaydetme -- başarısız olmasına neden oluyor. Bu döngünün senkron olarak tamamlanması gerekiyor ki tüm PDF içeriğini doğru sırayla alabilelim. new Promise(resolve => setTimeout(resolve, 0)) kullanmamın tek nedeni döngü sırasında tarayıcının yanıt verebilirliğini biraz artırmak ve bu, orijinal gönderide gösterildiği gibi çalışıyor.
then'in callback'ından async'ı kaldırdım ve exportSvg fonksiyonunun eşzamanlı sürümüne geçtim ve bu iyi çalışıyor. Sadece await new Promise(resolve => setTimeout(resolve, 0)).then(...) ile sarmalamadan exporter.exportSvgAsync çağrısını beklemek, döngü içinde tarayıcının hiç yanıt vermesini sağlamadı.