所以我有这个噩梦代码完美无缺,我把它放到了课堂上。然而它开始抛出承诺错误:-((没有fun()函数它工作正常。
class test {
constructor() {
this.init(() => {
this.start()
})
}
init() {
this.nightmare = new Nightmare({
show: true,
typeInterval: 20,
openDevTools: {
detach: true
}
});
}
async start() {
await this.nightmare
.useragent(userAgent)
.goto("https://www.yahoo.com")
fun();
async function fun() {
await this.nightmare.goto('https://google.com')
}
}
}
new test().start();
错误是:
(node:1101)UnhandledPromiseRejectionWarning:未处理的承诺拒绝(拒绝ID:1):TypeError:无法读取未定义的属性'nightmare'
(node:1101)[DEP0018]弃用警告:不推荐使用未处理的拒绝承诺。将来,未处理的承诺拒绝将使用非零退出代码终止Node.js进程。
答案 0 :(得分:1)
这与承诺或等待没有任何关系。您收到错误是因为this
未引用fun()
内的对象。当您创建一个函数并像调用fun()
一样调用它时,您将失去对this
对象的引用。考虑:
class test {
constructor() {
this.init()
}
init() {
this.prop = "a property"
}
start() {
console.log("this outside of fun: ", this)
fun()
function fun(){
console.log("this in fun:", this)
}
}
}
new test().start()
您会在this
中看到fun()
未定义。
考虑将fun()
作为一种真正的方法并使用this.fun()
进行调用。或者,您可以手动绑定this
,例如:
fun.call(this)