我似乎有一个未经处理的承诺拒绝,我找不到......
我用--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是元素的数量。
答案 0 :(得分:0)
我不知道这是问题所在,但它似乎是少数几种可能性之一。
async
函数返回一个promise,这意味着你的loop()
函数返回一个promise。如果此函数内部存在错误,而该错误不属于其他承诺,则这些错误将变为未处理的拒绝。考虑:
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;
即使函数中没有promise,throw()
也会导致未处理的promise拒绝。 (我认为代码片段会吞下它们,但你可以在控制台中看到它)
要抓住这些内容,您需要catch
本身loop()
。对于在超时中调用它的方式,这可能不太方便,但您可以执行以下操作:
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;