我收到"未处理的承诺拒绝"当试图加载页面(来自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?
有关如何解决此问题的任何想法?
答案 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);
});