0

我熟悉异步编程和使用回调,但是我不熟悉使用 Promise。我有以下代码:

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,我相信是这种情况,因为当我返回元素时,它不会等待HTML元素被推入因为它是异步的。我知道如果我使用回调,我可以使用回调(元素),但我不确定在这种情况下该怎么做。

编辑:page.evaluate() 是 phantomjs-node 使用的函数,可在此处找到https://github.com/amir20/phantomjs-node。这也只是一段代码。当只返回一个 HTML 元素时,我可以获得它的类名。像这样:

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));
4

1 回答 1

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,也是这个 repo 的所有者。

如果您想在生活中更快乐,我强烈建议您使用async/await而不是Promises.

于 2018-01-03T20:02:27.337 回答