【问题标题】:Uncaught exception onReject callback Promise未捕获的异常 onReject 回调 Promise
【发布时间】:2025-12-11 17:00:01
【问题描述】:

从昨天开始,我试图理解一个我不知道的关于 onReject Promise 回调的行为。事实上,我使用 API(返回 json 数据)和 Superagent 来发出请求。我有这门课:

class Api
{
    constructor(uri) {
        ...
    }

    // Simple GET HTTP Request
    get(...) {
        var url = this.buildUrl(...);
        this.requestPending = request.get(url);
        return new Promise((resolve, reject) => {
            this.requestPending.end((err, res) => {
                if (err) {
                    reject(res.body.error);
                } else {
                    resolve(res.body);
                }
            });
        });
    }
}

我不明白的是:

reject(res.body.error);

抛出异常(res.body.error 包含一个简单的字符串)。事实上,萤火虫显示这个错误:

uncaught exception: ...

你能解释一下这种行为吗?

PS:我使用 babel 来编译 js。

编辑

我用 when librairie 进行了测试,但结果相同。但是,当我写:

reject(new Error("foo"));

onReject 回调永远不会被调用:

when.all([
   api.get(...),
   api.get(...)
]).then(data => {
   console.log(data)
}, err => {
   console.log(err);
})

在浏览器中:

我继续我的研究。

编辑 2

真的很抱歉,我应该在公共广场上被鞭打!!!。事实上,我不得不更改一个文件而不是两个。真的,真的很抱歉!!

【问题讨论】:

  • 好吧,无论出于何种原因访问 res.body.error 都会引发错误,请尝试找出出现这种情况的原因(例如,它不存在)。
  • 事实上,并不是res.body.error 抛出错误,因为当我写reject("foo") 时,结果是一样的。
  • 或者实际的this.requestPending.end 函数抛出错误。你读过异常的内容吗?
  • 把函数的内容放在一个try/catch里面
  • 不,异常没有被捕获。事实上,我使用Promise.all(发送多个请求)。我只是用一个承诺进行了测试。这次 .then 方法上的 onReject 回调已经运行。但是,Promise.all 应该具有与一个承诺相同的行为?!

标签: javascript promise babeljs


【解决方案1】:

我不知道它是否傻,可能是requestPending的范围可能是问题。如果听起来很傻,对不起,

 var url = this.buildUrl(...),self = this;
        this.requestPending = request.get(url);
        return new Promise((resolve, reject) => {
            self.requestPending.end((err, res) => {
                if (err) {
                    reject(res.body.error);
                } else {
                     resolve(res.body);
                }
            });
        });
    }
}

【讨论】:

  • 不,不是。箭头函数确实保留了this context(不是“范围”,顺便说一句)
  • 哦,对不起,我的代码有错误。其实我bind(this)这个函数
  • @Jean:.bind() 具有词法 this 的箭头函数没有意义?
  • 是的,对不起,我在我的代码中保留了旧语法,使用 function。我更新代码。谢谢。