Javascript 使用Dream.js未处理的承诺拒绝

Javascript 使用Dream.js未处理的承诺拒绝,javascript,typescript,headless-browser,nightmare,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 > d

当我试图加载一个页面(从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);
    });
例外情况如下:

未处理的承诺拒绝(拒绝id:1):错误:评估在30000毫秒后超时。您是在调用done()还是在解决您的承诺?


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

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

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);
});
在深入研究之后,我发现
evaluate
应该返回一个
Promise
,如果后跟
那么

Promise
s也是
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);
});

你是想阻止超时发生还是拒绝被未处理?@Bergi我想阻止拒绝被未处理。我想我也弄明白了,如果evaluate函数后面跟一个
那么
,那么它必须返回一个promise。然后只需将
.catch(handler)
链接到您的链,或者将处理程序作为第二个参数传递到最后的
。我深入研究了函数,它建议
evaluate
应该返回一个
promise
:“
Promise
s也作为
evaluate
的一部分受到支持。如果函数的返回值包含then成员,
.evaluate()
假定它正在等待承诺。“