class Javascript 中的 Promises 和 nightmareJS

Promises and nightmareJS in class Javascript

所以我有这个噩梦般的代码,它运行得非常好,我把它放到了 class 中。但是它开始抛出承诺错误:-((没有 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: Unhandled promise rejection (rejection id: 1): TypeError: Cannot read property 'nightmare' of undefined

(node:1101) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.

这与 promises 或 await 没有任何关系。你得到一个错误,因为 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()

您会看到 thisfun() 中未定义。

考虑使 fun() 成为一个真正的方法并使用 this.fun() 调用它或者您可以手动绑定 this 与类似的东西:

 fun.call(this)