未处理的承诺拒绝警告返回null

时间:2018-04-12 06:30:29

标签: javascript node.js

我似乎有一个未经处理的承诺拒绝,我找不到......

我用--trace-warnings运行了nodejs,我的脚本顶部有以下代码:

process.on('unhandledRejection', (reason, p) => {
  console.log('Unhandled Rejection at:', p, 'reason:', reason);
  console.log(p)
  console.log(reason)
});

当承诺被拒绝时,我明白了:

Unhandled Rejection at: Promise { <rejected> null } reason: null
Promise { <rejected> null }
null

我已经检查了一些异步函数和承诺,而且它们都有.catch()的......这到底是怎么回事?我怎样才能找出拒绝的来源?

一些代码。我的课程中有以下异步函数:

async loop() {
    console.log("starting loop")
    if ( this.state != this.STOPPED ) {
        switch (this.case) {
            case this.POLLING:
                console.log("Start polling")
                await Promise.all(this.symbols.map(symbol => {
                    return this.fetch(symbol)
                })).then(() => {
                    ...
                }).catch(error => {
                    ...
                })
                for (let symbol of this.symbols) {
                    await this.process(symbol).then(() => {
                        ...                         
                    }).catch(error => {
                        ...
                    })
                } //for
                for (let openPosition of this.openPositions) {
                    this.log.push(openPosition.toLogString())
                }
                console.log("end polling")
                break
        } //state selection case
        console.log(this.log.formatTimestamp(Date.now()))
        this.log.dump()
        this.log.clear()
        console.log("done dumping")
        setTimeout(this.loop.bind(this), 0)
    }
}

奇怪的是输出,重复:

starting loop
Start polling
end polling
done dumping
Unhandled Rejection at: Promise { <rejected> null } reason: null
Promise { <rejected> null }
null

警告基本上出现在 setTimeout()致电。不知道为什么这是一个问题。另外值得注意的是,我似乎得到了不同数量的拒绝请求,具体取决于数组this.OpenPositions中有多少元素。对于n> 1,我得到n-1个错误,其中n是元素的数量。

1 个答案:

答案 0 :(得分:0)

我不知道这是问题所在,但它似乎是少数几种可能性之一。

async函数返回一个promise,这意味着你的loop()函数返回一个promise。如果此函数内部存在错误,而该错误不属于其他承诺,则这些错误将变为未处理的拒绝。考虑:

&#13;
&#13;
let obj = {
    count: 0,
    async loop() {
      this.count++
        console.log("running: ", this.count)
      if (this.count == 2) throw ("whoops")
      if (this.count < 2) {
        setTimeout(this.loop.bind(this), 0)
    } 
  }
}
obj.loop()
&#13;
&#13;
&#13;

即使函数中没有promise,throw()也会导致未处理的promise拒绝。 (我认为代码片段会吞下它们,但你可以在控制台中看到它)

要抓住这些内容,您需要catch本身loop()。对于在超时中调用它的方式,这可能不太方便,但您可以执行以下操作:

&#13;
&#13;
let obj = {
  count: 0,
  async loop() {
    this.count++
      console.log("running: ", this.count)
    if (this.count == 2) throw ("whoops")
    if (this.count < 2) {
      if (this.count < 2) {
        setTimeout(() => this.loop()
        .catch(err => console.log("caught error: ", err)), 0)
      }
    }
    return this.count
  }

}
obj.loop().catch(err => console.log("caught error outside: ", err))
&#13;
&#13;
&#13;