Javascript 使用Dream.js未处理的承诺拒绝
当我试图加载一个页面(从codefights.com)并等待加载某些html元素时,我收到了一个“未处理的承诺拒绝” 这是我的密码: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
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()
假定它正在等待承诺。“