gpt4 book ai didi

node.js - Node + Promise + Phantom.JS - 奇怪的错误

转载 作者:太空宇宙 更新时间:2023-11-03 22:11:24 25 4
gpt4 key购买 nike

我正在使用 Node 和 npm phantom 来制作许多网页的屏幕截图。为了节省 CPU,我为每个进程使用一个 Phantom 实例。在本例中,我打开一个页面,渲染它,关闭它并继续。

除了当我开始另一个进程时,这真的很棒。在这种情况下,当一个进程完成时,我收到此错误:

UnhandledPromiseRejectionWarning:未处理的 promise 拒绝(拒绝 ID:2):错误:未定义不是对象(评估“target[command.params[0]]”)

虚拟实例:

function initPhantom(todos) {
phantom.create(['--ignore-ssl-errors=no'], {logLevel: 'error'})
.then(function (instance) {
var processId = instance.process.pid;
console.log("===================> instance: ", processId);
phInstance = instance;
webshot(0, todos);
});
}

循环访问 URL:

function webshot(id, shots) {
phInstance.createPage().then(function (_page) {
sitepage = _page;
sitepage.property('viewportSize', {width: 1024, height: 768});
WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.120 Safari/537.36');
sitepage.setting("resourceTimeout", 4000);
return sitepage.open(shots[id].url);
})
.then(function (status) {
console.log("render %s / %s", id + 1, shots.length);
setTimeout(function () {
var image = 'temp_img/' + shots[id]._id + '.png';
sitepage.render(image, {format: 'png', quality: '30'}).then(function (finished) {
sitepage.close();
chekcImageinDb(shots[id], image);
if (id < shots.length - 1) {
id += 1;
webshot(id, shots);
} else {
console.log("===================> all done: %s files has been written", shots.length);
phInstances.shift();
if(phInstances.length < 1){
console.log("kill phantom ", phInstances);
//phInstance.exit();
}
}
});
}, 2000);
})
}

任何想法

--------编辑------------

好的,我尝试了你的建议,同样的错误。正如您在日志中看到的,它仅在一个进程完成后发生。

function webshot(id, shots) {
phInstance.createPage().then(function (_page, error) {
if(error){
console.log("first", error);
}
sitepage = _page;
sitepage.property('viewportSize', {width: 1024, height: 768});
WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.120 Safari/537.36');
sitepage.setting("resourceTimeout", 4000);
return sitepage.open(shots[id].url);
}).catch(function(e) {
console.log(e);
}).then(function (status, error) {
if(error){
console.log(error)
}
console.log("render %s / %s", id + 1, shots.length);
setTimeout(function () {
var image = 'temp_img/' + shots[id]._id + '.png';
sitepage.render(image, {format: 'png', quality: '30'})
.then(function (finished, error) {
if(error){
console.log(error)
}
sitepage.close();
chekcImageinDb(shots[id], image);
if (id < shots.length - 1) {
id += 1;
webshot(id, shots);
} else {
console.log("===================> all done: %s files has been written", shots.length);
phInstances.shift();
if(phInstances.length < 1){
console.log("kill phantom ", phInstances);
//phInstance.exit();
}
}
}).catch(function(e) {
console.log(e);
});
}, 2000);
}).catch(function(e) {
console.log(e);
})
}

这是几乎同时启动的两个实例的日志文件。就像我说的,如果只有一个进程正在运行,那么一切都会很好。

enter image description here

最佳答案

我认为您需要将第二个回调函数传递给失败处理程序的 then 函数调用。根据接口(interface)的不同,您可能需要在 then() 调用之后链接 .catch(function(){})

关于node.js - Node + Promise + Phantom.JS - 奇怪的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40758230/

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