Javascript中的Promises和nightmareJS

时间:2017-11-06 20:48:38

标签: javascript node.js class promise nightmare

所以我有这个噩梦代码完美无缺,我把它放到了课堂上。然而它开始抛出承诺错误:-((没有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进程。

1 个答案:

答案 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)