Javascript 尝试确定是否已加载所有图像时,Node.js挂起
我正在用Puppeter编写一个脚本,在这个脚本中,我需要确定是否所有图像都已完成加载,即使它们未能加载,这里是有问题的部分:Javascript 尝试确定是否已加载所有图像时,Node.js挂起,javascript,node.js,promise,es6-promise,puppeteer,Javascript,Node.js,Promise,Es6 Promise,Puppeteer,我正在用Puppeter编写一个脚本,在这个脚本中,我需要确定是否所有图像都已完成加载,即使它们未能加载,这里是有问题的部分: var images = await page.evaluate(function() { return new Promise( function(resolve, reject) { var imgs = document.images, imagesNumber = imgs.len
var images = await page.evaluate(function() {
return new Promise(
function(resolve, reject) {
var imgs = document.images,
imagesNumber = imgs.length,
counter = 0;
if (imagesNumber == 0)
{
resolve({images: []});
}
for (var i = 0; i < imgs.length; i++)
{
imgs[i].addEventListener( 'load', incrementCounter, false );
imgs[i].addEventListener( 'error', incrementCounter, false );
}
function incrementCounter() {
counter++;
if ( counter === imagesNumber ) {
resolve({images: imgs});
}
}
}
)
});
var images=wait page.evaluate(函数(){
回报新的承诺(
功能(解析、拒绝){
var imgs=document.images,
imagesNumber=imgs.length,
计数器=0;
如果(imagesNumber==0)
{
解析({images:[]});
}
对于(变量i=0;i
我不确定我做错了什么,但nodejs只是挂起了这段代码。任何想法都值得赞赏。问题可能是当您运行
页面时,某些图像已经加载。请评估
要检查图像是否已加载,可以使用属性complete
:
for (var i = 0; i < imgs.length; i++)
{
if (imgs[i].complete) {
counter += 1;
}
imgs[i].addEventListener( 'load', incrementCounter, false );
imgs[i].addEventListener( 'error', incrementCounter, false );
}
for(变量i=0;i
您必须调试正在加载和未加载的图像。您可以像这样插入代码以输出图像总数和每个图像编号完成时的状态。这将为您留下一个在控制台中完成的图像列表,然后您可以看到哪些图像没有完成
var images = await page.evaluate(function() {
return new Promise(function(resolve, reject) {
var imgs = document.images,
imagesNumber = imgs.length,
counter = 0;
if (imagesNumber === 0) {
resolve({images: []});
}
console.log(`Total images: ${imgs.length}`);
for (var i = 0; i < imgs.length; i++) {
if (imgs[i].complete) {
console.log(`Image ${i} already complete, counter=${counter}`);
incrementCounter();
} else {
imgs[i].addEventListener( 'load', incrementCounter(i, 'load'), false );
imgs[i].addEventListener( 'error', incrementCounter(i, 'error'), false );
}
}
function incrementCounter(i, status) {
return function() {
console.log(`Image ${i} ${status}, counter=${counter}`)
counter++;
if ( counter === imagesNumber ) {
console.log("All images loaded");
resolve({images: imgs});
}
}
}
});
});
var images=wait page.evaluate(函数(){
返回新承诺(功能(解决、拒绝){
var imgs=document.images,
imagesNumber=imgs.length,
计数器=0;
如果(imagesNumber==0){
解析({images:[]});
}
log(`Total images:${imgs.length}`);
对于(变量i=0;i
一旦您知道哪些图像尚未完成,您就可以检查HTML,查看这些特定图像可能需要进行哪些额外的调试,以了解它们的情况。什么是“挂起”?你的意思是你的承诺不能解决吗?或者你的意思是,这个过程实际上陷入了一个无限循环中?Nodejs过程没有结束,它只是停留在运行状态,当我删除上面的代码时,应用程序的其余部分就会工作,所以,这个承诺永远不会解决?然后,您需要添加一系列调试,以查看图像计数是多少,哪些图像没有向您提供load
消息,然后,只有到那时,您才能开始找出原因。这是基本的调试。我们无法为您执行此操作,因为我们无法访问相关代码和文档。如何记录来自promise的消息?我尝试将nodejs控制台传递给评估函数,但得到“错误:评估失败:类型错误:cons.log不是函数”即使我将控制台日志放在promise@PetarVasilev-我不知道那句话是什么意思。