【发布时间】:2022-02-04 12:23:46
【问题描述】:
使用dom-to-image library,我们可以使用 Promises 转换图像。
使用示例,从DOM对象到PNG图片的转换:
var node = document.getElementById('my-node');
domtoimage.toPng(node)
.then(function (dataUrl) {
var img = new Image();
img.src = dataUrl;
document.body.appendChild(img);
})
.catch(function (error) {
console.error('oops, something went wrong!', error);
});
在幕后,toPng 方法是一个 Promise 对象的链:
/**
* @param {Node} node - The DOM Node object to render
* @param {Object} options - Rendering options, @see {@link toSvg}
* @return {Promise} - A promise that is fulfilled with a PNG image data URL
* */
function toPng(node, options) {
return draw(node, options || {})
.then(function (canvas) {
return canvas.toDataURL();
});
}
我想根据 Node 数组转换图像,然后按顺序获取这些图像。问题是当我调用toPng() 时,异步处理时间随 DOM 目标复杂性的函数而变化。所以它会在复杂度较低的页面之前返回,而不是按顺序返回页面。
let pages = document.querySelectorAll('.page');
pages.forEach(page => {
let dataUrl = convertToPng(page.firstElementChild);
});
function convertToPng(page) {
domtoimage.toPng(page)
.then(function (dataUrl) {
console.log(page); // prints pages randomly (e.g. page3, page1, page2)
})
}
一个可能的解决方案是使用 Promise.all() 方法并使用 forEach() 方法附加所有 Promise。但在这种情况下,我使用的是外部库,我不知道如何处理才能首先获取 page1,然后是 page 2,依此类推...
【问题讨论】:
-
链式承诺?我假设您想等到 page1 “完成”后再开始 page2 等?
-
@JaromandaX 是的,我想等到 page1 完成,然后再开始下一页。
-
如果你想变得更时髦,试试
async / await -
@Keith 我知道
async / await,但我不知道如何在这个库中应用它。 -
ps.. 还要确保你从
convertToPng返回你的承诺...
标签: javascript promise