我熟悉异步编程和使用回调,但是我不熟悉使用promises。我有以下代码:
page.evaluate(function() {
elements.push(document.getElementById('form_username'));
elements.push(document.getElementById('form_password'));
return elements;
}).then(function(html){
console.log(html[0].className);
}).then( () => {
_page.close();
_ph.exit();
}).catch(err => console.log(err));
我收到一个错误,当我将它传递给'html'并尝试获取className时,0不存在类型undefined,我相信是这样的,因为当我返回元素时它不会等待HTML元素因为它是异步的而被推入。我知道如果我使用回调,我可以使用回调(元素),但我不知道在这种情况下该怎么做。
编辑:page.evaluate()是phantomjs-node使用的函数,在https://github.com/amir20/phantomjs-node找到。这只是一段代码。当只返回一个HTML元素时,我可以获得它的className。像这样:
page.evaluate(function() {
return document.getElementById('form_username');
}).then(function(html){
console.log(html.className);
}).then( () => {
_page.close();
_ph.exit();
}).catch(err => console.log(err));
答案 0 :(得分:0)
我不知道elements
中的evaluate
是什么。但是,你真的应该只返回这样的东西:
page.evaluate(function() {
return [document.getElementById('form_username'), document.getElementById('form_password')];
})
正如其他人所说,我不太确定返回的DOM对象是否有效。它会很好地序列化为JSON但你不能调用任何DOM对象。即,上述内容不适用于elements[0].getAttrinute('name')
。只传递数据,因为phantomjs是一个不同的过程。所以所有数据都是序列化的。
最好通过你需要的东西。像这样:
return [document.getElementById('form_username').className, document.getElementById('form_password').className]
免责声明:我是Github的amir20和这个回购的所有者。
如果你想让生活更幸福,我强烈建议你使用async/await
代替Promises
。