未经处理的承诺拒绝与Nightmare.js

时间:2017-05-10 21:40:07

标签: javascript typescript headless-browser nightmare

我收到"未处理的承诺拒绝"当试图加载页面(来自codefights.com)并等待某些html元素加载时。

这是我的代码:

import * as Nightmare from 'nightmare';

const nightmare = Nightmare({ show: true });

nightmare
    .goto('https://codefights.com/interview/EDaACHNYHyH6qQFAL')
    .wait('body > div:nth-child(9) > div > div.page--header > div > span')
    .evaluate((selector) => {
        return document.querySelector(selector);
    }, 'body > div:nth-child(9) > div > div.page--header > div > span')
    .end()
    .then((functionTitle) => {
        console.log(functionTitle);
    });

以下是例外:

Unhandled promise rejection (rejection id: 1): Error: Evaluation timed out after 30000msec. Are you calling done() or resolving your promises?

有关如何解决此问题的任何想法?

2 个答案:

答案 0 :(得分:1)

在深入了解the documentation a bit more后,我发现evaluate如果后面跟Promise,则应返回then

  

Promise也作为evaluate的一部分受到支持。如果退货   函数的值有一个then成员,.evaluate()假定它是   等待承诺。

以下是它修复时的外观:

nightmare
.goto(url)
.wait('body > div:nth-child(9) > div > div.page--header > div > span')
.evaluate((selector) => {
    return new Promise((resolve, reject) => {
        try {
            resolve(document.querySelector(selector).innerText);
        } catch (exception) {
            reject(exception);
        }
    });
}, 'body > div:nth-child(9) > div > div.page--header > div > span')
.end()
.then((functionTitle) => {
    console.log(functionTitle);
});

答案 1 :(得分:0)

要处理拒绝,只需将.catch(handler)链接到您的链或将处理程序作为第二个参数传递给最终chain

nightmare
.goto('https://codefights.com/interview/EDaACHNYHyH6qQFAL')
.wait('body > div:nth-child(9) > div > div.page--header > div > span')
.evaluate(selector => {
    return document.querySelector(selector);
}, 'body > div:nth-child(9) > div > div.page--header > div > span')
.end()
.then(functionTitle => {
    console.log(functionTitle);
}, error => {
    console.error(error);
});