gpt4 book ai didi

javascript - 在所有 promise 之后调用函数

转载 作者:行者123 更新时间:2023-11-30 14:05:33 24 4
gpt4 key购买 nike

在所有 promise 都已解决后,如何调用函数?我有一个包含三个表的 HTML 文档。使用 html2canvas(),我通过在 forEach() 循环中迭代它们来创建 JPG:

JavaScript

var elements = document.querySelectorAll( 'table' );
elements = Array.from( elements );

var zip = new JSZip(),
img = '';

elements.forEach( function( element ) {
html2canvas( element ).then( canvas => {
var styleID = element.getAttribute('id');

img = new Image();
img.src = canvas.toDataURL( 'image/jpeg' );
document.body.appendChild( img );

zip.file( styleID + '.jpg', img.src );
}).then( generateZip );
});

function generateZip () {
// Generate the zip file asynchronously
zip.generateAsync({type:'blob'}).then( function( content ) {
saveAs( content, 'archive.zip' );
});
}

问题是 generateZip() 被调用了三次,每个循环调用一次。在所有 promises 都已解决后,我如何只调用一次 generateZip() 来创建一个 zip 文件?

最佳答案

您可以使用 Promise#all在调用 generateZip 方法之前知道所有 promise 何时完成。使用 Promise#all 也很有趣因为如果一个 html2canvas 失败,整个 Promise 将失败并且不会调用 generateZip。

The Promise.all() method returns a single Promise that resolves when all of the promises passed as an iterable have resolved or when the iterable contains no promises. It rejects with the reason of the first promise that rejects.

Promise#all 在 then 回调中返回的 data 是您的 canvas 的数组。

var elements = document.querySelectorAll( 'table' );
elements = Array.from( elements );

var zip = new JSZip(),
img = '';

function generateZip () {
// Generate the zip file asynchronously
zip.generateAsync({type:'blob'}).then( function( content ) {
saveAs( content, 'archive.zip' );
});
}

function prepareZip(canvas, element){
var styleID = element.getAttribute('id');
img = new Image();
img.src = canvas.toDataURL( 'image/jpeg' );
document.body.appendChild( img );
zip.file( styleID + '.jpg', img.src );
}

Promise.all(elements.map(element=> html2canvas(element)))
.then(data=>{
data.forEach((canvas, index)=>prepareZip(canvas, elements[index]));
generateZip();
});

没有箭头函数的解决方案:

var elements = document.querySelectorAll( 'table' );
elements = Array.from( elements );

var zip = new JSZip(),
img = '';

function generateZip () {
// Generate the zip file asynchronously
zip.generateAsync({type:'blob'}).then( function( content ) {
saveAs( content, 'archive.zip' );
});
}

function prepareZip(canvas, element){
var styleID = element.getAttribute('id');
img = new Image();
img.src = canvas.toDataURL( 'image/jpeg' );
document.body.appendChild( img );
zip.file( styleID + '.jpg', img.src );
}

Promise.all(elements.map(function(element){ return html2canvas(element); }))
.then(function(data){
data.forEach(function(canvas, index){
prepareZip(canvas, elements[index])
});
generateZip();
});

关于javascript - 在所有 promise 之后调用函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55482082/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com