NodeJS:异步返回数组到下一个promise

时间:2018-01-03 17:58:07

标签: node.js asynchronous promise phantomjs-node

我熟悉异步编程和使用回调,但是我不熟悉使用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));

1 个答案:

答案 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